# app/api/v1/marketplace.py """ Marketplace endpoints - simplified with service-level exception handling. This module provides classes and functions for: - Product import from marketplace CSV files - Import job management and monitoring - Import statistics and job cancellation """ import logging from typing import List, Optional from fastapi import APIRouter, BackgroundTasks, Depends, Query from sqlalchemy.orm import Session from app.api.deps import get_current_user from app.core.database import get_db from app.services.marketplace_service import marketplace_service from app.tasks.background_tasks import process_marketplace_import from middleware.decorators import rate_limit from models.schemas.marketplace import (MarketplaceImportJobResponse, MarketplaceImportRequest) from models.database.user import User router = APIRouter() logger = logging.getLogger(__name__) @router.post("/marketplace/import-product", response_model=MarketplaceImportJobResponse) @rate_limit(max_requests=10, window_seconds=3600) # Limit marketplace imports async def import_products_from_marketplace( request: MarketplaceImportRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Import products from marketplace CSV with background processing (Protected).""" logger.info( f"Starting marketplace import: {request.marketplace} -> {request.shop_code} by user {current_user.username}" ) # Create import job through service import_job = marketplace_service.create_import_job(db, request, current_user) # Process in background background_tasks.add_task( process_marketplace_import, import_job.id, request.url, request.marketplace, request.shop_code, request.batch_size or 1000, ) return MarketplaceImportJobResponse( job_id=import_job.id, status="pending", marketplace=request.marketplace, shop_code=request.shop_code, shop_id=import_job.shop_id, shop_name=import_job.shop_name, message=f"Marketplace import started from {request.marketplace}. Check status with " f"/import-status/{import_job.id}", ) @router.get( "/marketplace/import-status/{job_id}", response_model=MarketplaceImportJobResponse ) def get_marketplace_import_status( job_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Get status of marketplace import job (Protected).""" job = marketplace_service.get_import_job_by_id(db, job_id, current_user) return marketplace_service.convert_to_response_model(job) @router.get( "/marketplace/import-jobs", response_model=List[MarketplaceImportJobResponse] ) def get_marketplace_import_jobs( marketplace: Optional[str] = Query(None, description="Filter by marketplace"), shop_name: Optional[str] = Query(None, description="Filter by shop name"), skip: int = Query(0, ge=0), limit: int = Query(50, ge=1, le=100), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Get marketplace import jobs with filtering (Protected).""" jobs = marketplace_service.get_import_jobs( db=db, user=current_user, marketplace=marketplace, shop_name=shop_name, skip=skip, limit=limit, ) return [marketplace_service.convert_to_response_model(job) for job in jobs] @router.get("/marketplace/marketplace-import-stats") def get_marketplace_import_stats( db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): """Get statistics about marketplace import jobs (Protected).""" return marketplace_service.get_job_stats(db, current_user) @router.put( "/marketplace/import-jobs/{job_id}/cancel", response_model=MarketplaceImportJobResponse, ) def cancel_marketplace_import_job( job_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Cancel a pending or running marketplace import job (Protected).""" job = marketplace_service.cancel_import_job(db, job_id, current_user) return marketplace_service.convert_to_response_model(job) @router.delete("/marketplace/import-jobs/{job_id}") def delete_marketplace_import_job( job_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Delete a completed marketplace import job (Protected).""" marketplace_service.delete_import_job(db, job_id, current_user) return {"message": "Marketplace import job deleted successfully"}