7adcec3309
Reports in _audit/:
audit_FRONTEND_COVERAGE.md — SA-1 (Explore): 9 HTML files, 0 orphan handlers (clean)
audit_API_GAP.md — SA-2 (Explore): 356 backend routes vs 54 frontend paths
23 missing routes / 39 call sites
audit_DB_INTEGRITY.md — SA-3 (general-purpose): 8 SQL probes, FKs/NULLs clean,
48 dup-OIB clusters, 518 low-cov klubovi
audit_CONSOLIDATED.md — top 10 critical with owner matrix (cc1/cc4/cc5/cc6)
Headlines:
Frontend: clean (post-R3 refactors landed)
API gap: CRM module systemic — 16 of 23 missing routes need /crm prefix in crm.html
6 missing routes are trailing-slash bugs in crm.html
DB: 48 OIB dup clusters in klubovi (~100 rows) need merge+unique-index
518/2244 klubovi (23%) <33% coverage → enrichment_worker target list
14 scoreboard-string klubovi rows (RK ... HRL Zapad od X) → DELETE
~30 backup tables (~97k rows) cluttering pgz_sport schema
Owner allocation:
cc1 → #6 backup-table archival, #8 verify, #9 sportas trailing-slash
cc4 → #1 OIB dedup script, #4 scoreboard DELETE, #10 schema CHECKs
cc5 → #2 /crm prefix sweep on crm.html, #3 trailing-slash sweep, #7 notif endpoint
cc6 → #5 enrichment_worker batch on filled<4 klubovi
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.8 KiB
6.8 KiB
SA-2 API Gap Analysis
Generated: 2026-05-05T06:25:39.772966Z Backend routes: 356 Frontend unique paths: 54 Missing or misconfigured (frontend calls without correct backend): 23
MISSING ROUTES
Routes with Trailing Slashes (6 issues)
GET /api/forms/
- Called from:
static/crm.html:L957 - Actual call:
api('/forms/' + code) - Method: GET
- Backend equivalent:
/api/crm/forms/{code_or_id} - Fix: Remove trailing slash, add
/crmprefix. Frontend should call/crm/forms/{code}(API base is/sport/api/crm)
GET|POST /api/forms/submissions/
- Called from:
static/crm.html:L1039,static/crm.html:L1087,static/crm.html:L1126,static/crm.html:L1135,static/crm.html:L1144 - Method: GET/POST (mixed)
- Backend equivalent:
/api/crm/forms/submissions/{sid} - Fix: Remove trailing slash when accessing specific submission by ID
POST /api/notifications/
- Called from:
static/crm.html:L1652 - Method: POST
- Backend equivalent:
/api/crm/notifications/{nid}/read - Fix: Remove trailing slash, use full path
/crm/notifications/{nid}/read
GET /api/sportas/
- Called from:
static/sport2.html:L1582,static/sport2_new.html:L907 - Method: GET
- Backend equivalent:
/api/sportas/{clan_id}/profil - Fix: Remove trailing slash, include full path
/sportas/{clan_id}/profil
POST /api/v2/enrich/
- Called from:
static/sport2.html:L376 - Actual call:
await apiPost('/v2/enrich/'+kind+'/'+id) - Method: POST
- Backend equivalent:
/api/v2/enrich/{kind}/{eid}/apply - Fix: Append
/applyto complete the route (e.g.,/v2/enrich/klub/{eid}/apply)
POST /api/v2/forensic/findings/
- Called from:
static/sport2.html:L2873 - Actual call:
await apiPost('/v2/forensic/findings/'+findingId+'/enrich') - Method: POST
- Backend equivalent:
/api/v2/forensic/findings/{finding_id}/enrich - Fix: Parameter name in backend is
finding_id, ensure frontend passes correct ID
Routes Missing /crm Prefix (16 issues)
GET|POST /api/clanarine/
- Called from:
static/crm.html:L503,static/crm.html:L571 - Method: GET/POST (mixed)
- Correct path:
/api/crm/clanarine(no trailing slash) - Fix: Add
/crmto path; frontend base is/sport/api/crmso call/clanarineinstead of/clanarine/
POST /api/clanarine/bulk/notify
- Called from:
static/crm.html:L417 - Method: POST
- Correct path:
/api/crm/clanarine/bulk/notify - Fix: Add
/crmprefix; frontend base is/sport/api/crmso call/clanarine/bulk/notify
POST /api/clanarine/bulk/uplatnice
- Called from:
static/crm.html:L456 - Method: POST
- Correct path:
/api/crm/clanarine/bulk/uplatnice - Fix: Add
/crmprefix
POST /api/clanarine/notify-bulk
- Called from:
static/crm.html:L631 - Method: POST
- Correct path:
/api/crm/clanarine/notify-bulk - Fix: Add
/crmprefix
GET|POST /api/email-templates
- Called from:
static/crm.html:L1675,static/crm.html:L1824 - Method: GET/POST (mixed)
- Correct path:
/api/crm/email-templates - Fix: Add
/crmprefix
GET /api/forms
- Called from:
static/crm.html:L900,static/crm.html:L1846 - Method: GET
- Correct path:
/api/crm/forms - Fix: Add
/crmprefix
GET|POST /api/forms/submissions
- Called from:
static/crm.html:L901,static/crm.html:L1035,static/crm.html:L1053 - Method: GET/POST (mixed)
- Correct path:
/api/crm/forms/submissions - Fix: Add
/crmprefix
GET /api/klubovi/
- Called from:
static/app.html:L508,static/sport2.html:L1294,static/sport2_new.html:L702 - Method: GET
- Correct path:
/api/klubovi(no trailing slash) - Fix: Remove trailing slash (frontend base is
/sport/apiso path becomes/sport/api/klubovi→/api/kluboviafter nginx rewrite)
GET|POST /api/lijecnicki/
- Called from:
static/crm.html:L794,static/crm.html:L808 - Method: GET/POST (mixed)
- Correct path:
/api/crm/lijecnicki(no trailing slash) - Fix: Add
/crmprefix, remove trailing slash
POST /api/lijecnicki/notify-scan
- Called from:
static/crm.html:L1644 - Method: POST
- Correct path:
/api/crm/lijecnicki/notify-scan - Fix: Add
/crmprefix
GET /api/notifications
- Called from:
static/crm.html:L1591,static/crm.html:L1848 - Method: GET
- Correct path:
/api/crm/notifications - Fix: Add
/crmprefix
POST /api/notifications/mark-all-read
- Called from:
static/crm.html:L1661 - Method: POST
- Correct path:
/api/crm/notifications/mark-all-read - Fix: Add
/crmprefix
GET /api/savezi/
- Called from:
static/app.html:L488,static/sport2.html:L1146,static/sport2_new.html:L558 - Method: GET
- Correct path:
/api/savezi(no trailing slash) - Fix: Remove trailing slash (frontend base is
/sport/apiso path becomes/sport/api/savezi→/api/saveziafter nginx rewrite)
GET /api/stats
- Called from:
static/crm.html:L1517 - Method: GET
- Correct path:
/api/crm/stats - Fix: Add
/crmprefix
GET /api/zzjz/info
- Called from:
static/crm.html:L721 - Method: GET
- Correct path:
/api/crm/zzjz/info - Fix: Add
/crmprefix
GET /api/zzjz/termini
- Called from:
static/crm.html:L722 - Method: GET
- Correct path:
/api/crm/zzjz/termini - Fix: Add
/crmprefix
Parameter Mismatch (1 issue)
POST /api/crm/notifications/{nid}/read
- Called from:
static/app.html:L1310 - Issue: Frontend passes
{n.id}but backend expects{nid} - Fix: Update template variable in frontend to match backend parameter name, or update backend to accept
idinstead ofnid
SUMMARY TABLE
| Category | Count |
|---|---|
| Total unique frontend paths checked | 54 |
| Successfully matched to backend | 31 |
| Missing routes with issues | 23 |
| - Trailing slash issues | 6 |
| - Missing /crm prefix | 16 |
| - Parameter mismatches | 1 |
| Total call locations with problems | 39 |
ROOT CAUSE ANALYSIS
- Trailing slashes: Frontend code constructs paths dynamically using template variables (e.g.,
/api/forms/+ code), but leaves trailing slash in base path - Missing /crm prefix: CRM module endpoints require
/crm/prefix in API path, but some frontend files are calling the base/api/version instead of going through the CRM submodule - Parameter name mismatch: Template variable names in frontend don't match backend parameter names (e.g.,
{n.id}vs{nid})
RECOMMENDATIONS
- Audit all
api(),apiAuth(), andapiPost()calls in frontend to ensure correct base paths and prefixes - Review nginx rewrite rules to confirm
/sport/api/crm/*→/api/crm/*mapping - Add linting rule or static analysis to catch trailing slashes in API calls
- Document API path conventions for each HTML file (which use
/api,/sport/api,/sport/api/crm, etc.) - Consider normalizing frontend API call helpers to automatically handle path prefixes consistently
Generated by SA-2 API Gap Analysis Agent