diff --git a/src/service/dependencies.py b/src/service/dependencies.py index 7447aaf..d649b06 100644 --- a/src/service/dependencies.py +++ b/src/service/dependencies.py @@ -8,4 +8,32 @@ Classes: Functions: - List: Description - Functions: Description -""" \ No newline at end of file +""" +from typing import Annotated +from fastapi import Depends, Query + +from src.database import db_dependency + +from src.service.exceptions import ServiceNotFoundException +from src.service.models import Service +from src.service.schemas import ServiceIDMixin + + +async def get_service_model_query(db: db_dependency, service_id: Annotated[int, Query(gt=0)]): + service_model = db.get(Service, service_id) + if service_model is None: + raise ServiceNotFoundException(service_id=service_id) + + return service_model + +service_model_query_dependency = Annotated[type[Service], Depends(get_service_model_query)] + + +async def get_service_model_body(db: db_dependency, request_model: ServiceIDMixin): + service_model = db.get(Service, request_model.service_id) + if service_model is None: + raise ServiceNotFoundException(service_id=request_model.service_id) + + return service_model + +service_model_body_dependency = Annotated[type[Service], Depends(get_service_model_body)] diff --git a/src/service/exceptions.py b/src/service/exceptions.py index 5debbb4..e2b5232 100644 --- a/src/service/exceptions.py +++ b/src/service/exceptions.py @@ -4,4 +4,16 @@ Module specific exceptions for Exceptions: - List: Description - Exceptions: Description -""" \ No newline at end of file +""" +from typing import Optional + +from fastapi import HTTPException, status + + +class ServiceNotFoundException(HTTPException): + def __init__(self, service_id: Optional[int] = None) -> None: + detail = "Service not found" if service_id is None else f"Service with ID '{service_id}' was not found." + super().__init__( + status_code=status.HTTP_404_NOT_FOUND, + detail=detail, + ) diff --git a/src/service/router.py b/src/service/router.py index 8ce058c..5012258 100644 --- a/src/service/router.py +++ b/src/service/router.py @@ -5,17 +5,15 @@ Endpoints: - List: Description - Endpoints: Description """ -from typing import Annotated - -from fastapi import APIRouter, HTTPException, status -from fastapi.params import Path +from fastapi import APIRouter, status from src.database import db_dependency from src.service.models import Service from src.service.utils import generate_api_key +from src.service.dependencies import service_model_body_dependency from src.service.schemas import ServiceGetServiceResponse, ServicePostServiceRequest, ServicePostServiceResponse, \ - ServiceWithKeyResponse, ServicePatchKeyResponse + ServiceWithKeyResponse, ServicePatchKeyResponse, ServicePatchKeyRequest, ServiceDeleteServiceRequest router = APIRouter( tags=["Service"], @@ -41,27 +39,19 @@ async def register_service(db: db_dependency, service_request: ServicePostServic db.commit() return {"service": response} -@router.patch("/{service_id}/key", response_model=ServicePatchKeyResponse) -async def regenerate_api_key(db: db_dependency, service_id: Annotated[int, Path(gt=0,description="Service database ID")]): +@router.patch("/key", response_model=ServicePatchKeyResponse) +async def regenerate_api_key(db: db_dependency, service_model: service_model_body_dependency, request_model: ServicePatchKeyRequest): # TODO: super_admin_dependency - service_model = db.get(Service, service_id) - if service_model is None: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Service not found") - key = generate_api_key() service_model.api_key = key + db.flush() response = ServiceWithKeyResponse(**service_model.__dict__) - db.commit() return {"service": response} -@router.delete("/{service_id}", status_code=status.HTTP_204_NO_CONTENT) -async def remove_service(db: db_dependency, service_id: Annotated[int, Path(gt=0,description="Service database ID")]): +@router.delete("/", status_code=status.HTTP_204_NO_CONTENT) +async def remove_service(db: db_dependency, service_model: service_model_body_dependency, request_model: ServiceDeleteServiceRequest): # TODO: super_admin_dependency - service_model = db.get(Service, service_id) - if service_model is None: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Service not found") - db.delete(service_model) db.commit() diff --git a/src/service/schemas.py b/src/service/schemas.py index c316919..deef4e3 100644 --- a/src/service/schemas.py +++ b/src/service/schemas.py @@ -9,6 +9,9 @@ from pydantic import ConfigDict from src.schemas import CustomBaseModel +class ServiceIDMixin(CustomBaseModel): + service_id: int + class ServiceResponse(CustomBaseModel): model_config = ConfigDict(from_attributes=True, extra="ignore") @@ -27,5 +30,11 @@ class ServicePostServiceRequest(CustomBaseModel): class ServicePostServiceResponse(CustomBaseModel): service: ServiceWithKeyResponse +class ServicePatchKeyRequest(ServiceIDMixin): + pass + class ServicePatchKeyResponse(CustomBaseModel): service: ServiceWithKeyResponse + +class ServiceDeleteServiceRequest(ServiceIDMixin): + pass