from __future__ import annotations from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, status from src.application.site_config import ( activate_script_config_version, create_script_config_version, create_target_site, get_target_site, list_script_config_versions, rollback_script_config_version, update_target_site, ) from src.domain.auth import ADMIN_ROLES, EDITOR_OR_ADMIN_ROLES from src.domain.contracts import ( CurrentUser, ScriptConfigVersionCreateRequest, ScriptConfigVersionListResponse, ScriptConfigVersionResponse, TargetSiteConfigCreateRequest, TargetSiteConfigResponse, TargetSiteConfigUpdateRequest, ) from src.infrastructure.repositories import BackendRepository from src.presentation.dependencies import get_repository, require_roles router = APIRouter(prefix="/api", tags=["sites"]) @router.get("/sites", response_model=list[TargetSiteConfigResponse]) def list_sites( _: CurrentUser = Depends(require_roles(EDITOR_OR_ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> list[TargetSiteConfigResponse]: return [TargetSiteConfigResponse(site=site) for site in repository.target_sites.list()] @router.get("/sites/{site_id}", response_model=TargetSiteConfigResponse) def get_site( site_id: UUID, _: CurrentUser = Depends(require_roles(EDITOR_OR_ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> TargetSiteConfigResponse: try: return get_target_site(repository, site_id) except LookupError as error: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not Found") from error @router.post( "/sites", response_model=TargetSiteConfigResponse, status_code=status.HTTP_201_CREATED, ) def post_site( request: TargetSiteConfigCreateRequest, _: CurrentUser = Depends(require_roles(ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> TargetSiteConfigResponse: return create_target_site(repository, request) @router.patch("/sites/{site_id}", response_model=TargetSiteConfigResponse) def patch_site( site_id: UUID, request: TargetSiteConfigUpdateRequest, _: CurrentUser = Depends(require_roles(ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> TargetSiteConfigResponse: try: return update_target_site(repository, site_id, request) except LookupError as error: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not Found") from error @router.get( "/sites/{site_id}/publishing-config/versions", response_model=ScriptConfigVersionListResponse, ) def get_script_config_versions( site_id: UUID, _: CurrentUser = Depends(require_roles(EDITOR_OR_ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> ScriptConfigVersionListResponse: try: versions = list_script_config_versions(repository, site_id) except LookupError as error: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not Found") from error return ScriptConfigVersionListResponse(versions=versions) @router.post( "/sites/{site_id}/publishing-config/versions", response_model=ScriptConfigVersionResponse, status_code=status.HTTP_201_CREATED, ) def post_script_config_version( site_id: UUID, request: ScriptConfigVersionCreateRequest, current_user: CurrentUser = Depends(require_roles(ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> ScriptConfigVersionResponse: try: return create_script_config_version( repository, site_id=site_id, current_user=current_user, request=request, ) except LookupError as error: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not Found") from error @router.post( "/sites/{site_id}/publishing-config/versions/{version_id}/activate", response_model=ScriptConfigVersionResponse, ) def post_activate_script_config_version( site_id: UUID, version_id: UUID, current_user: CurrentUser = Depends(require_roles(ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> ScriptConfigVersionResponse: try: return activate_script_config_version( repository, site_id=site_id, version_id=version_id, current_user=current_user, ) except LookupError as error: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not Found") from error @router.post( "/sites/{site_id}/publishing-config/versions/{version_id}/rollback", response_model=ScriptConfigVersionResponse, ) def post_rollback_script_config_version( site_id: UUID, version_id: UUID, current_user: CurrentUser = Depends(require_roles(ADMIN_ROLES)), repository: BackendRepository = Depends(get_repository), ) -> ScriptConfigVersionResponse: try: return rollback_script_config_version( repository, site_id=site_id, version_id=version_id, current_user=current_user, ) except LookupError as error: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not Found") from error