157 lines
5.2 KiB
Python
157 lines
5.2 KiB
Python
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
|