refactor: fix architecture violations in admin marketplace endpoint
Move database queries to service layer and use proper Pydantic responses: Schema changes (models/schema/marketplace_import_job.py): - Add AdminMarketplaceImportJobResponse with extra fields (id, error_details, created_by_name) - Add AdminMarketplaceImportJobListResponse with items/total/page/limit format Service changes (app/services/marketplace_import_job_service.py): - Add convert_to_admin_response_model() for admin-specific response - Add get_all_import_jobs_paginated() for admin listing - Add get_import_job_by_id_admin() without access control API changes (app/api/v1/admin/marketplace.py): - Use service methods instead of direct DB queries - Use proper Pydantic response models instead of dicts - All business logic now in service layer Cleanup: - Remove duplicate methods from admin_service.py Architecture validation now passes with 0 violations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,7 @@ from models.database.marketplace_import_job import MarketplaceImportJob
|
||||
from models.database.user import User
|
||||
from models.database.vendor import Vendor
|
||||
from models.schema.marketplace_import_job import (
|
||||
AdminMarketplaceImportJobResponse,
|
||||
MarketplaceImportJobRequest,
|
||||
MarketplaceImportJobResponse,
|
||||
)
|
||||
@@ -186,10 +187,8 @@ class MarketplaceImportJobService:
|
||||
status=job.status,
|
||||
marketplace=job.marketplace,
|
||||
vendor_id=job.vendor_id,
|
||||
vendor_code=job.vendor.vendor_code if job.vendor else None, # FIXED
|
||||
vendor_name=(
|
||||
job.vendor.name if job.vendor else None
|
||||
), # FIXED: from relationship
|
||||
vendor_code=job.vendor.vendor_code if job.vendor else None,
|
||||
vendor_name=job.vendor.name if job.vendor else None,
|
||||
source_url=job.source_url,
|
||||
imported=job.imported_count or 0,
|
||||
updated=job.updated_count or 0,
|
||||
@@ -201,7 +200,77 @@ class MarketplaceImportJobService:
|
||||
completed_at=job.completed_at,
|
||||
)
|
||||
|
||||
# ... other methods (cancel, delete, etc.) remain similar ...
|
||||
def convert_to_admin_response_model(
|
||||
self, job: MarketplaceImportJob
|
||||
) -> AdminMarketplaceImportJobResponse:
|
||||
"""Convert database model to admin API response model with extra fields."""
|
||||
return AdminMarketplaceImportJobResponse(
|
||||
id=job.id,
|
||||
job_id=job.id,
|
||||
status=job.status,
|
||||
marketplace=job.marketplace,
|
||||
vendor_id=job.vendor_id,
|
||||
vendor_code=job.vendor.vendor_code if job.vendor else None,
|
||||
vendor_name=job.vendor.name if job.vendor else None,
|
||||
source_url=job.source_url,
|
||||
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=[],
|
||||
created_at=job.created_at,
|
||||
started_at=job.started_at,
|
||||
completed_at=job.completed_at,
|
||||
created_by_name=job.user.username if job.user else None,
|
||||
)
|
||||
|
||||
def get_all_import_jobs_paginated(
|
||||
self,
|
||||
db: Session,
|
||||
marketplace: str | None = None,
|
||||
status: str | None = None,
|
||||
page: int = 1,
|
||||
limit: int = 100,
|
||||
) -> tuple[list[MarketplaceImportJob], int]:
|
||||
"""Get all marketplace import jobs with pagination (for admin)."""
|
||||
try:
|
||||
query = db.query(MarketplaceImportJob)
|
||||
|
||||
if marketplace:
|
||||
query = query.filter(
|
||||
MarketplaceImportJob.marketplace.ilike(f"%{marketplace}%")
|
||||
)
|
||||
if status:
|
||||
query = query.filter(MarketplaceImportJob.status == status)
|
||||
|
||||
total = query.count()
|
||||
skip = (page - 1) * limit
|
||||
jobs = (
|
||||
query.order_by(MarketplaceImportJob.created_at.desc())
|
||||
.offset(skip)
|
||||
.limit(limit)
|
||||
.all()
|
||||
)
|
||||
|
||||
return jobs, total
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting all import jobs: {str(e)}")
|
||||
raise ValidationException("Failed to retrieve import jobs")
|
||||
|
||||
def get_import_job_by_id_admin(
|
||||
self, db: Session, job_id: int
|
||||
) -> MarketplaceImportJob:
|
||||
"""Get a marketplace import job by ID (admin - no access control)."""
|
||||
job = (
|
||||
db.query(MarketplaceImportJob)
|
||||
.filter(MarketplaceImportJob.id == job_id)
|
||||
.first()
|
||||
)
|
||||
if not job:
|
||||
raise ImportJobNotFoundException(job_id)
|
||||
return job
|
||||
|
||||
|
||||
marketplace_import_job_service = MarketplaceImportJobService()
|
||||
|
||||
Reference in New Issue
Block a user