feat: Sprint 1 - Deep discovery, lead persistence, and dashboard nav

- Add BacklinkOutreachScraper (Exa + DuckDuckGo deep scraping)
- Extend DB and Pydantic models for lead enrichment columns
- Add StorageService methods for lead CRUD with auto-migration
- Add backend endpoints: deep discover, campaign detail, lead management
- Extend frontend API client and store with discovery + lead actions
- Create BacklinkOutreachDashboard component with campaigns/discover/leads tabs
- Register route at /backlink-outreach under SEO feature flag
- Add nav entry under Enterprise & Advanced in tool categories
This commit is contained in:
ajaysi
2026-05-23 17:07:33 +05:30
parent 816d59a30a
commit 090d69761f
22 changed files with 3494 additions and 48 deletions

View File

@@ -99,13 +99,14 @@ def _map_wix_error(exc: Exception, fallback: str = "Wix API request failed") ->
return exc
if isinstance(exc, requests.HTTPError):
status = exc.response.status_code if exc.response is not None else None
msg = str(exc) if str(exc) != "" else fallback
if status == 401:
return HTTPException(status_code=401, detail="Wix authentication expired or invalid")
return HTTPException(status_code=401, detail=msg)
if status == 403:
return HTTPException(status_code=403, detail="Insufficient Wix permissions/scope")
return HTTPException(status_code=502, detail=fallback)
return HTTPException(status_code=403, detail=msg)
return HTTPException(status_code=502, detail=msg)
if isinstance(exc, requests.RequestException):
return HTTPException(status_code=502, detail=fallback)
return HTTPException(status_code=502, detail=str(exc) or fallback)
return HTTPException(status_code=500, detail=str(exc))