from __future__ import annotations from uuid import UUID from fastapi import APIRouter, Request, Response, status from app.brand.schemas import BrandKitCreate, BrandKitResponse from app.security.errors import ForbiddenError router = APIRouter(prefix="/v1/brand", tags=["brand"]) def _identity(request: Request) -> tuple[str, str]: context = request.state.auth if not context.workspace_id or not context.user_id: raise ForbiddenError return context.workspace_id, context.user_id @router.post("", response_model=BrandKitResponse, status_code=status.HTTP_201_CREATED) async def create_brand_kit(request: Request, payload: BrandKitCreate) -> BrandKitResponse: workspace_id, user_id = _identity(request) kit, version = await request.app.state.container.brand_kits.create_brand_kit( workspace_id=workspace_id, name=payload.name, description=payload.description, user_id=user_id, ) latest = await request.app.state.container.brand_kits.get_brand_kit_version( workspace_id=workspace_id, brand_kit_id=kit.id, user_id=user_id, ) return BrandKitResponse( id=kit.id, name=kit.name, description=kit.description, status=kit.status, is_default=kit.is_default, active_version_id=latest.id, created_at=kit.created_at.isoformat(), updated_at=kit.updated_at.isoformat(), ) @router.get("", response_model=list[BrandKitResponse]) async def list_brand_kits(request: Request) -> list[BrandKitResponse]: workspace_id, user_id = _identity(request) kits = await request.app.state.container.brand_kits.list_brand_kits( workspace_id=workspace_id, user_id=user_id, ) response: list[BrandKitResponse] = [] for kit in kits: try: latest = await request.app.state.container.brand_kits.get_brand_kit_version( workspace_id=workspace_id, brand_kit_id=kit.id, user_id=user_id, ) active_version_id = latest.id except Exception: active_version_id = kit.active_version_id response.append(BrandKitResponse( id=kit.id, name=kit.name, description=kit.description, status=kit.status, is_default=kit.is_default, active_version_id=active_version_id, created_at=kit.created_at.isoformat(), updated_at=kit.updated_at.isoformat(), )) return response @router.patch("/{brand_kit_id}", response_model=BrandKitResponse) async def update_brand_kit(request: Request, brand_kit_id: UUID, payload: BrandKitCreate) -> BrandKitResponse: workspace_id, user_id = _identity(request) version = await request.app.state.container.brand_kits.update_brand_kit( workspace_id=workspace_id, brand_kit_id=str(brand_kit_id), user_id=user_id, data=payload.initial_version, ) kit = await request.app.state.container.brand_kits.get_brand_kit(workspace_id, str(brand_kit_id), user_id=user_id) return BrandKitResponse( id=kit.id, name=kit.name, description=kit.description, status=kit.status, is_default=kit.is_default, active_version_id=version.id, created_at=kit.created_at.isoformat(), updated_at=kit.updated_at.isoformat(), ) @router.delete("/{brand_kit_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_brand_kit(request: Request, brand_kit_id: UUID) -> Response: workspace_id, user_id = _identity(request) await request.app.state.container.brand_kits.delete_brand_kit( workspace_id=workspace_id, brand_kit_id=str(brand_kit_id), user_id=user_id, ) return Response(status_code=status.HTTP_204_NO_CONTENT)