58 lines
1.7 KiB
Python
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)}
|