From 652dfb7b4ae0f0c67476e3f8feb17ffeb0794535 Mon Sep 17 00:00:00 2001 From: luxferre Date: Tue, 26 May 2026 10:16:59 +0100 Subject: [PATCH] feat: service module req/res models --- src/service/router.py | 62 ++++++++++++++++++++++-------------------- src/service/schemas.py | 32 ++++++++++++++++++++-- 2 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/service/router.py b/src/service/router.py index 7617dc0..8ce058c 100644 --- a/src/service/router.py +++ b/src/service/router.py @@ -5,59 +5,63 @@ Endpoints: - List: Description - Endpoints: Description """ -from fastapi import APIRouter +from typing import Annotated + +from fastapi import APIRouter, HTTPException, status +from fastapi.params import Path from src.database import db_dependency from src.service.models import Service from src.service.utils import generate_api_key - +from src.service.schemas import ServiceGetServiceResponse, ServicePostServiceRequest, ServicePostServiceResponse, \ + ServiceWithKeyResponse, ServicePatchKeyResponse router = APIRouter( tags=["Service"], prefix="/service", ) -@router.get("/") +@router.get("/", response_model=ServiceGetServiceResponse) async def get_all_services(db: db_dependency): # TODO: user_dependency - # TODO: request model permission_models = db.query(Service).all() - # TODO: Response model - return permission_models + return {"services": permission_models} -@router.post("/") -async def register_service(db: db_dependency, service_name: str): +@router.post("/", response_model=ServicePostServiceResponse) +async def register_service(db: db_dependency, service_request: ServicePostServiceRequest): # TODO: super_admin_dependency - # TODO: request model key = generate_api_key() - service_model = Service(name=service_name, api_key=key) + service_model = Service(name=service_request.name, api_key=key) db.add(service_model) + db.flush() + response = ServiceWithKeyResponse(**service_model.__dict__) db.commit() - # TODO: response model + return {"service": response} -@router.patch("/{service_id}/key") -async def regenerate_api_key(db: db_dependency, service_id: int): +@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")]): # TODO: super_admin_dependency - # TODO: request model - key = generate_api_key() - service_model = db.query(Service).filter(Service.id==service_id).first() - service_model.api_key = key - - db.add(service_model) - db.commit() - # TODO: response model - -@router.delete("/{service_id}") -async def remove_service(db: db_dependency, service_id: int): - # TODO: super_admin_dependency - # TODO: request model - service_model = db.query(Service).filter(Service.id==service_id).first() + service_model = db.get(Service, service_id) if service_model is None: - return + 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")]): + # 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() - # TODO: response model diff --git a/src/service/schemas.py b/src/service/schemas.py index a074c75..f2e4ac0 100644 --- a/src/service/schemas.py +++ b/src/service/schemas.py @@ -1,7 +1,35 @@ """ -Pydantic models for +Pydantic models for the service module Models: - List: Description - Models: Description -""" \ No newline at end of file +""" +from typing import Optional + +from pydantic import EmailStr, ConfigDict + +from src.schemas import CustomBaseModel +from src.organisation.constants import Status, ContactType +from src.contact.schemas import ContactAddress + +class ServiceResponse(CustomBaseModel): + model_config = ConfigDict(from_attributes=True, extra="ignore") + + id: int + name: str + +class ServiceWithKeyResponse(ServiceResponse): + api_key: str + +class ServiceGetServiceResponse(CustomBaseModel): + services: list[ServiceResponse] + +class ServicePostServiceRequest(CustomBaseModel): + name: str + +class ServicePostServiceResponse(CustomBaseModel): + service: ServiceWithKeyResponse + +class ServicePatchKeyResponse(CustomBaseModel): + service: ServiceWithKeyResponse