diff --git a/src/personal_info/app.py b/src/personal_info/app.py index 5e521ff..bb1d455 100644 --- a/src/personal_info/app.py +++ b/src/personal_info/app.py @@ -12,9 +12,10 @@ def create_app() -> FastAPI: return 'ok' - from personal_info.routers import persons, addresses + from personal_info.routers import persons, addresses, documents app.include_router(persons.router) app.include_router(addresses.router) + app.include_router(documents.router) return app \ No newline at end of file diff --git a/src/personal_info/db/schemas/__init__.py b/src/personal_info/db/schemas/__init__.py index a975bed..fb7584b 100644 --- a/src/personal_info/db/schemas/__init__.py +++ b/src/personal_info/db/schemas/__init__.py @@ -1,2 +1,3 @@ from .person import * -from .address import * \ No newline at end of file +from .address import * +from .documents import * \ No newline at end of file diff --git a/src/personal_info/db/schemas/documents.py b/src/personal_info/db/schemas/documents.py new file mode 100644 index 0000000..4b2fb25 --- /dev/null +++ b/src/personal_info/db/schemas/documents.py @@ -0,0 +1,27 @@ +from datetime import date +from typing import List, Optional + +from pydantic import BaseModel, Field, ConfigDict +from pydantic.types import UUID4 + +class DocumentCreateIn(BaseModel): + person_id: UUID4 + category: str + series: str + number: str + issued_by: str + issued_at: date | None + attachments: Optional[List[str]] + +class DocumentCreateOut(DocumentCreateIn): + id: UUID4 + class Config: + orm_mode = True + +class DocumentUpdateIn(BaseModel): + category: str | None + series: str | None + number: str | None + issued_by: str | None + issued_at: date | None + attachments: Optional[List[str]] \ No newline at end of file diff --git a/src/personal_info/routers/documents.py b/src/personal_info/routers/documents.py new file mode 100644 index 0000000..f4eb48f --- /dev/null +++ b/src/personal_info/routers/documents.py @@ -0,0 +1,31 @@ +from fastapi import Depends, Request +from fastapi.routing import APIRouter +from pydantic.types import UUID4 +from typing import List, Optional, Dict + +from personal_info.db import models +from personal_info.db.schemas import (DocumentCreateOut, DocumentCreateIn, DocumentUpdateIn) +from personal_info.services import DocumentService, get_documents_service + +router = APIRouter(prefix='/documents') + +@router.post('/', status_code=201, response_model=DocumentCreateOut) +async def create_document( + document: DocumentCreateIn, documents_service: DocumentService = Depends(get_documents_service) +) -> models.Document: + return documents_service.create(document) + +@router.patch('/{id}', response_model=DocumentCreateOut) +async def update_document( + id: UUID4, + document: DocumentUpdateIn, + documents_service: DocumentService = Depends(get_documents_service) + ) -> Optional[models.Document]: + return documents_service.update(id, document) + +@router.delete('/{id}', status_code=200) +async def update_document( + id: UUID4, + documents_service: DocumentService = Depends(get_documents_service) + ) -> None: + return documents_service.delete(id) \ No newline at end of file diff --git a/src/personal_info/services/__init__.py b/src/personal_info/services/__init__.py index 4e774c3..095e26f 100644 --- a/src/personal_info/services/__init__.py +++ b/src/personal_info/services/__init__.py @@ -5,6 +5,7 @@ from personal_info.db.session import get_session from .persons import PersonService from .addresses import AddressService +from .documents import DocumentService def get_persons_service(db_session: Session = Depends(get_session)) -> PersonService: return PersonService(db_session) @@ -12,4 +13,7 @@ def get_persons_service(db_session: Session = Depends(get_session)) -> PersonSer def get_addresses_service(db_session: Session = Depends(get_session)) -> AddressService: return AddressService(db_session) -__all__ = ('get_persons_service', 'get_addresses_service') \ No newline at end of file +def get_documents_service(db_session: Session = Depends(get_session)) -> DocumentService: + return DocumentService(db_session) + +__all__ = ('get_persons_service', 'get_addresses_service', 'get_documents_service') \ No newline at end of file diff --git a/src/personal_info/services/documents.py b/src/personal_info/services/documents.py new file mode 100644 index 0000000..3dc5ab1 --- /dev/null +++ b/src/personal_info/services/documents.py @@ -0,0 +1,9 @@ +from typing import Any, List, Dict +from sqlalchemy.orm import Session +from personal_info.db.schemas import (DocumentCreateIn) +from personal_info.db import models +from personal_info.services.base import BaseService + +class DocumentService(BaseService[models.Document, DocumentCreateIn, Any]): + def __init__(self, db_session: Session): + super(DocumentService, self).__init__(models.Document, db_session) \ No newline at end of file