diff --git a/src/personal_info/app.py b/src/personal_info/app.py index bb1d455..c63fbd1 100644 --- a/src/personal_info/app.py +++ b/src/personal_info/app.py @@ -12,10 +12,11 @@ def create_app() -> FastAPI: return 'ok' - from personal_info.routers import persons, addresses, documents + from personal_info.routers import persons, addresses, documents, contacts app.include_router(persons.router) app.include_router(addresses.router) app.include_router(documents.router) + app.include_router(contacts.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 fb7584b..8021cf5 100644 --- a/src/personal_info/db/schemas/__init__.py +++ b/src/personal_info/db/schemas/__init__.py @@ -1,3 +1,4 @@ from .person import * from .address import * -from .documents import * \ No newline at end of file +from .documents import * +from .contacts import * \ No newline at end of file diff --git a/src/personal_info/db/schemas/contacts.py b/src/personal_info/db/schemas/contacts.py new file mode 100644 index 0000000..5ddc7c9 --- /dev/null +++ b/src/personal_info/db/schemas/contacts.py @@ -0,0 +1,19 @@ +from datetime import date +from typing import List, Optional + +from pydantic import BaseModel, Field, ConfigDict +from pydantic.types import UUID4 + +class ContactCreateIn(BaseModel): + person_id: UUID4 + category: str + value: str + +class ContactCreateOut(ContactCreateIn): + id: UUID4 + class Config: + orm_mode = True + +class ContactUpdateIn(BaseModel): + category: str | None + value: str | None \ No newline at end of file diff --git a/src/personal_info/routers/addresses.py b/src/personal_info/routers/addresses.py index 035d74b..2fe7dee 100644 --- a/src/personal_info/routers/addresses.py +++ b/src/personal_info/routers/addresses.py @@ -24,7 +24,7 @@ async def update_address( return addresses_service.update(id, address) @router.delete('/{id}', status_code=200) -async def update_address( +async def delete_address( id: UUID4, addresses_service: AddressService = Depends(get_addresses_service) ) -> None: diff --git a/src/personal_info/routers/contacts.py b/src/personal_info/routers/contacts.py new file mode 100644 index 0000000..32c5efd --- /dev/null +++ b/src/personal_info/routers/contacts.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 (ContactCreateOut, ContactCreateIn, ContactUpdateIn) +from personal_info.services import ContactService, get_contacts_service + +router = APIRouter(prefix='/contacts') + +@router.post('/', status_code=201, response_model=ContactCreateOut) +async def create_contact( + contact: ContactCreateIn, contacts_service: ContactService = Depends(get_contacts_service) +) -> models.Contact: + return contacts_service.create(contact) + +@router.patch('/{id}', response_model=ContactCreateOut) +async def update_contact( + id: UUID4, + contact: ContactUpdateIn, + contacts_service: ContactService = Depends(get_contacts_service) + ) -> Optional[models.Contact]: + return contacts_service.update(id, contact) + +@router.delete('/{id}', status_code=200) +async def delete_contact( + id: UUID4, + contacts_service: ContactService = Depends(get_contacts_service) + ) -> None: + return contacts_service.delete(id) \ No newline at end of file diff --git a/src/personal_info/routers/documents.py b/src/personal_info/routers/documents.py index f4eb48f..4f8d92c 100644 --- a/src/personal_info/routers/documents.py +++ b/src/personal_info/routers/documents.py @@ -24,7 +24,7 @@ async def update_document( return documents_service.update(id, document) @router.delete('/{id}', status_code=200) -async def update_document( +async def delete_document( id: UUID4, documents_service: DocumentService = Depends(get_documents_service) ) -> None: diff --git a/src/personal_info/services/__init__.py b/src/personal_info/services/__init__.py index 095e26f..befaf0f 100644 --- a/src/personal_info/services/__init__.py +++ b/src/personal_info/services/__init__.py @@ -6,6 +6,7 @@ from personal_info.db.session import get_session from .persons import PersonService from .addresses import AddressService from .documents import DocumentService +from .contacts import ContactService def get_persons_service(db_session: Session = Depends(get_session)) -> PersonService: return PersonService(db_session) @@ -16,4 +17,7 @@ def get_addresses_service(db_session: Session = Depends(get_session)) -> Address 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 +def get_contacts_service(db_session: Session = Depends(get_session)) -> ContactService: + return ContactService(db_session) + +__all__ = ('get_persons_service', 'get_addresses_service', 'get_documents_service', 'get_contacts_service') \ No newline at end of file diff --git a/src/personal_info/services/contacts.py b/src/personal_info/services/contacts.py new file mode 100644 index 0000000..f3f5e53 --- /dev/null +++ b/src/personal_info/services/contacts.py @@ -0,0 +1,9 @@ +from typing import Any, List, Dict +from sqlalchemy.orm import Session +from personal_info.db.schemas import (ContactCreateIn) +from personal_info.db import models +from personal_info.services.base import BaseService + +class ContactService(BaseService[models.Contact, ContactCreateIn, Any]): + def __init__(self, db_session: Session): + super(ContactService, self).__init__(models.Contact, db_session) \ No newline at end of file