64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
|
|
from app.api.dependencies.auth import get_access_token
|
|
from app.api.dependencies.permissions import require_permission
|
|
from app.application.admin.variants import VariantService
|
|
from app.schemas.auth import AuthenticatedUser
|
|
from app.schemas.admin import VariantCreate, VariantListResponse, VariantRead, VariantUpdate
|
|
|
|
router = APIRouter()
|
|
service = VariantService()
|
|
|
|
|
|
@router.get("", response_model=VariantListResponse)
|
|
async def list_variants(
|
|
experiment_id: str | None = Query(default=None),
|
|
access_token: str = Depends(get_access_token),
|
|
_: AuthenticatedUser = Depends(require_permission("can_manage_variants")),
|
|
) -> VariantListResponse:
|
|
items = await service.list_variants(
|
|
experiment_id=experiment_id,
|
|
access_token=access_token,
|
|
)
|
|
return VariantListResponse(items=items)
|
|
|
|
|
|
@router.get("/{variant_id}", response_model=VariantRead)
|
|
async def get_variant(
|
|
variant_id: str,
|
|
access_token: str = Depends(get_access_token),
|
|
_: AuthenticatedUser = Depends(require_permission("can_manage_variants")),
|
|
) -> VariantRead:
|
|
item = await service.get_variant(variant_id, access_token=access_token)
|
|
if not item:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=f"Variant '{variant_id}' not found.",
|
|
)
|
|
return item
|
|
|
|
|
|
@router.post("", response_model=VariantRead, status_code=status.HTTP_201_CREATED)
|
|
async def create_variant(
|
|
payload: VariantCreate,
|
|
access_token: str = Depends(get_access_token),
|
|
_: AuthenticatedUser = Depends(require_permission("can_manage_variants")),
|
|
) -> VariantRead:
|
|
return await service.create_variant(payload, access_token=access_token)
|
|
|
|
|
|
@router.patch("/{variant_id}", response_model=VariantRead)
|
|
async def update_variant(
|
|
variant_id: str,
|
|
payload: VariantUpdate,
|
|
access_token: str = Depends(get_access_token),
|
|
_: AuthenticatedUser = Depends(require_permission("can_manage_variants")),
|
|
) -> VariantRead:
|
|
item = await service.update_variant(variant_id, payload, access_token=access_token)
|
|
if not item:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=f"Variant '{variant_id}' not found.",
|
|
)
|
|
return item
|