rswag-online/backend/app/api/admin/products.py

58 lines
1.7 KiB
Python

"""Admin product management endpoints."""
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.services.design_service import DesignService
from app.services.auth_service import get_current_admin
router = APIRouter()
class ProductOverrideRequest(BaseModel):
is_active: bool | None = None
price_override: float | None = None
def get_design_service() -> DesignService:
return DesignService()
@router.put("/{slug}/override")
async def update_product_override(
slug: str,
override: ProductOverrideRequest,
db: AsyncSession = Depends(get_db),
design_service: DesignService = Depends(get_design_service),
_admin=Depends(get_current_admin),
):
"""Update product visibility or price override (admin only)."""
# Verify product exists
product = await design_service.get_product(slug)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
# Update override in database
await design_service.set_product_override(
db=db,
slug=slug,
is_active=override.is_active,
price_override=override.price_override,
)
return {"status": "updated", "slug": slug}
@router.post("/sync")
async def sync_designs(
design_service: DesignService = Depends(get_design_service),
_admin=Depends(get_current_admin),
):
"""Force sync designs from the designs directory (admin only)."""
# Clear any caches and reload
design_service.clear_cache()
designs = await design_service.list_designs()
return {"status": "synced", "count": len(designs)}