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:
2026-03-29 23:31:33 +02:00
parent 95f0eac079
commit f310363f7c
7 changed files with 208 additions and 63 deletions

View File

@@ -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,