fix(prospecting): fix scan-jobs batch endpoints and add job tracking
- Reorder routes: batch endpoints before /{prospect_id} to fix FastAPI
route matching (was parsing "batch" as prospect_id → 422)
- Add scan job tracking via stats_service.create_job/complete_job so
the scan-jobs table gets populated after each batch run
- Add contact scrape batch endpoint (POST /contacts/batch) with
get_pending_contact_scrape query
- Fix scan-jobs.js: explicit route map instead of naive replace
- Normalize domain_name on create/update (strip protocol, www, slash)
- Add domain_name to ProspectUpdate schema
- Add proposal for contact scraper enum + regex fixes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,11 +4,14 @@ Statistics service for the prospecting dashboard.
|
||||
"""
|
||||
|
||||
import logging
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.modules.prospecting.models import (
|
||||
JobStatus,
|
||||
JobType,
|
||||
Prospect,
|
||||
ProspectChannel,
|
||||
ProspectScanJob,
|
||||
@@ -56,6 +59,25 @@ class StatsService:
|
||||
"common_issues": self._get_common_issues(db),
|
||||
}
|
||||
|
||||
def create_job(self, db: Session, job_type: JobType) -> ProspectScanJob:
|
||||
"""Create a scan job record for tracking."""
|
||||
job = ProspectScanJob(
|
||||
job_type=job_type,
|
||||
status=JobStatus.RUNNING,
|
||||
started_at=datetime.now(UTC),
|
||||
)
|
||||
db.add(job)
|
||||
db.flush()
|
||||
return job
|
||||
|
||||
def complete_job(self, job: ProspectScanJob, processed: int, failed: int = 0) -> None:
|
||||
"""Mark a scan job as completed."""
|
||||
job.total_items = processed + failed
|
||||
job.processed_items = processed
|
||||
job.failed_items = failed
|
||||
job.status = JobStatus.COMPLETED
|
||||
job.completed_at = datetime.now(UTC)
|
||||
|
||||
def get_scan_jobs(
|
||||
self,
|
||||
db: Session,
|
||||
|
||||
Reference in New Issue
Block a user