diff --git a/app/api/v1/admin/marketplace.py b/app/api/v1/admin/marketplace.py index 0d635b11..fc39f896 100644 --- a/app/api/v1/admin/marketplace.py +++ b/app/api/v1/admin/marketplace.py @@ -11,9 +11,9 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_admin_api from app.core.database import get_db from app.exceptions import VendorNotFoundException -from app.services.admin_service import admin_service from app.services.marketplace_import_job_service import marketplace_import_job_service from app.services.stats_service import stats_service +from app.tasks.background_tasks import process_marketplace_import from models.database.user import User from models.database.vendor import Vendor from models.schema.marketplace_import_job import ( @@ -92,44 +92,8 @@ def get_all_marketplace_import_jobs( } -@router.get("/{job_id}") -def get_marketplace_import_job( - job_id: int, - db: Session = Depends(get_db), - current_admin: User = Depends(get_current_admin_api), -): - """Get a single marketplace import job by ID (Admin only).""" - from app.exceptions import ImportJobNotFoundException - from models.database.marketplace_import_job import MarketplaceImportJob - - job = db.query(MarketplaceImportJob).filter(MarketplaceImportJob.id == job_id).first() - if not job: - raise ImportJobNotFoundException(job_id) - - return { - "id": job.id, - "job_id": job.id, - "status": job.status, - "marketplace": job.marketplace, - "source_url": job.source_url, - "vendor_id": job.vendor.id if job.vendor else None, - "vendor_code": job.vendor.vendor_code if job.vendor else None, - "vendor_name": job.vendor.name if job.vendor else None, - "imported": job.imported_count or 0, - "updated": job.updated_count or 0, - "total_processed": job.total_processed or 0, - "error_count": job.error_count or 0, - "error_message": job.error_message, - "error_details": [], # Placeholder for future use - "created_at": job.created_at.isoformat() if job.created_at else None, - "started_at": job.started_at.isoformat() if job.started_at else None, - "completed_at": job.completed_at.isoformat() if job.completed_at else None, - "created_by_name": job.user.username if job.user else None, - } - - @router.post("", response_model=MarketplaceImportJobResponse) -def create_marketplace_import_job( +async def create_marketplace_import_job( request: AdminMarketplaceImportJobRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db), @@ -167,16 +131,14 @@ def create_marketplace_import_job( f"for vendor {vendor.vendor_code}" ) - # Start background processing - from app.tasks.background_tasks import process_marketplace_import - + # Start background processing (positional args like vendor endpoint) background_tasks.add_task( process_marketplace_import, - job_id=job.id, - url=request.source_url, - marketplace=request.marketplace, - vendor_id=vendor.id, - batch_size=request.batch_size or 1000, + job.id, + request.source_url, + request.marketplace, + vendor.id, + request.batch_size or 1000, ) logger.info(f"Background task queued for import job {job.id}") @@ -184,6 +146,7 @@ def create_marketplace_import_job( return marketplace_import_job_service.convert_to_response_model(job) +# NOTE: /stats must be defined BEFORE /{job_id} to avoid route conflicts @router.get("/stats") def get_import_statistics( db: Session = Depends(get_db), @@ -191,3 +154,39 @@ def get_import_statistics( ): """Get marketplace import statistics (Admin only).""" return stats_service.get_import_statistics(db) + + +@router.get("/{job_id}") +def get_marketplace_import_job( + job_id: int, + db: Session = Depends(get_db), + current_admin: User = Depends(get_current_admin_api), +): + """Get a single marketplace import job by ID (Admin only).""" + from app.exceptions import ImportJobNotFoundException + from models.database.marketplace_import_job import MarketplaceImportJob + + job = db.query(MarketplaceImportJob).filter(MarketplaceImportJob.id == job_id).first() + if not job: + raise ImportJobNotFoundException(job_id) + + return { + "id": job.id, + "job_id": job.id, + "status": job.status, + "marketplace": job.marketplace, + "source_url": job.source_url, + "vendor_id": job.vendor.id if job.vendor else None, + "vendor_code": job.vendor.vendor_code if job.vendor else None, + "vendor_name": job.vendor.name if job.vendor else None, + "imported": job.imported_count or 0, + "updated": job.updated_count or 0, + "total_processed": job.total_processed or 0, + "error_count": job.error_count or 0, + "error_message": job.error_message, + "error_details": [], # Placeholder for future use + "created_at": job.created_at.isoformat() if job.created_at else None, + "started_at": job.started_at.isoformat() if job.started_at else None, + "completed_at": job.completed_at.isoformat() if job.completed_at else None, + "created_by_name": job.user.username if job.user else None, + }