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

@@ -14,7 +14,7 @@ from services.integrations.wordpress_publisher import WordPressPublisher
from middleware.auth_middleware import get_current_user
router = APIRouter(prefix="/wordpress", tags=["WordPress"])
router = APIRouter(prefix="/api/wordpress", tags=["WordPress"])
# Pydantic Models
@@ -87,10 +87,9 @@ async def get_wordpress_status(user: dict = Depends(get_current_user)):
logger.info(f"Checking WordPress status for user: {user_id}")
# Get user's WordPress sites
sites = wp_service.get_all_sites(user_id)
sites = wp_service.get_user_sites(user_id)
if sites:
# Convert to response format
site_responses = [
WordPressSiteResponse(
id=site['id'],
@@ -103,15 +102,13 @@ async def get_wordpress_status(user: dict = Depends(get_current_user)):
)
for site in sites
]
logger.info(f"Found {len(sites)} WordPress sites for user {user_id}")
return WordPressStatusResponse(
connected=True,
sites=site_responses,
total_sites=len(sites)
)
else:
logger.info(f"No WordPress sites found for user {user_id}")
return WordPressStatusResponse(
connected=False,
sites=[],
@@ -152,7 +149,7 @@ async def add_wordpress_site(
)
# Get the added site info
sites = wp_service.get_all_sites(user_id)
sites = wp_service.get_user_sites(user_id)
if sites:
latest_site = sites[0] # Most recent site
return WordPressSiteResponse(
@@ -184,7 +181,7 @@ async def get_wordpress_sites(user: dict = Depends(get_current_user)):
logger.info(f"Getting WordPress sites for user: {user_id}")
sites = wp_service.get_all_sites(user_id)
sites = wp_service.get_user_sites(user_id)
site_responses = [
WordPressSiteResponse(