fix: align admin import endpoint with vendor pattern
Changes to match the working vendor marketplace import:
1. Make POST endpoint async (was sync)
2. Use positional args for background task (was keyword args)
3. Import process_marketplace_import at top of file (was inside function)
4. Fix route order: /stats now defined BEFORE /{job_id}
to avoid FastAPI route conflicts
5. Remove unused admin_service import
These changes align the admin endpoint with the vendor endpoint
pattern that was already working correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user