From 9d9a30d0c344e42f8a7218fe53410f1a0fe42cf9 Mon Sep 17 00:00:00 2001 From: dderbentsov Date: Tue, 8 Aug 2023 01:17:22 +0300 Subject: [PATCH] address create --- src/personal_info/app.py | 3 ++- src/personal_info/db/schemas/__init__.py | 3 ++- src/personal_info/db/schemas/address.py | 20 ++++++++++++++++++++ src/personal_info/routers/addresses.py | 23 +++++++++++++++++++++++ src/personal_info/routers/persons.py | 6 +++--- src/personal_info/services/__init__.py | 6 +++++- src/personal_info/services/addresses.py | 9 +++++++++ src/personal_info/services/persons.py | 2 +- 8 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/personal_info/db/schemas/address.py create mode 100644 src/personal_info/routers/addresses.py create mode 100644 src/personal_info/services/addresses.py diff --git a/src/personal_info/app.py b/src/personal_info/app.py index 120b4cb..5e521ff 100644 --- a/src/personal_info/app.py +++ b/src/personal_info/app.py @@ -12,8 +12,9 @@ def create_app() -> FastAPI: return 'ok' - from personal_info.routers import persons + from personal_info.routers import persons, addresses app.include_router(persons.router) + app.include_router(addresses.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 aa21ea5..a975bed 100644 --- a/src/personal_info/db/schemas/__init__.py +++ b/src/personal_info/db/schemas/__init__.py @@ -1 +1,2 @@ -from .person import * \ No newline at end of file +from .person import * +from .address import * \ No newline at end of file diff --git a/src/personal_info/db/schemas/address.py b/src/personal_info/db/schemas/address.py new file mode 100644 index 0000000..a684337 --- /dev/null +++ b/src/personal_info/db/schemas/address.py @@ -0,0 +1,20 @@ +from datetime import date +from typing import List, Optional + +from pydantic import BaseModel, Field, ConfigDict +from pydantic.types import UUID4 + +class AddressCreateIn(BaseModel): + person_id: UUID4 + category: str + region: Optional[str] + city: Optional[str] + street: Optional[str] + house: Optional[str] + flat: Optional[str] + +class AddressCreateOut(AddressCreateIn): + id: UUID4 + class Config: + orm_mode = True + diff --git a/src/personal_info/routers/addresses.py b/src/personal_info/routers/addresses.py new file mode 100644 index 0000000..82e6355 --- /dev/null +++ b/src/personal_info/routers/addresses.py @@ -0,0 +1,23 @@ +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 (AddressCreateOut, AddressCreateIn) +from personal_info.services import AddressService, get_addresses_service + +router = APIRouter(prefix='/address') + +@router.post('/', status_code=201, response_model=AddressCreateOut) +async def create_address( + address: AddressCreateIn, addresses_service: AddressService = Depends(get_addresses_service) +) -> models.Address: + return addresses_service.create(address) + +# @router.post('/batch', response_model=List[Person]) +# async def batch_list_persons( +# request: Dict = {}, +# persons_service: PersonService = Depends(get_persons_service) +# ) -> List[models.Person]: +# return persons_service.batch_get(request) diff --git a/src/personal_info/routers/persons.py b/src/personal_info/routers/persons.py index 0f86b62..186bc47 100644 --- a/src/personal_info/routers/persons.py +++ b/src/personal_info/routers/persons.py @@ -3,8 +3,8 @@ from fastapi.routing import APIRouter from pydantic.types import UUID4 from typing import List, Optional, Dict -from personal_info.db import models, schemas -from personal_info.db.schemas import Person, PersonDetail, PersonCreate +from personal_info.db import models +from personal_info.db.schemas import (Person, PersonDetail, PersonCreate) from personal_info.services import PersonService, get_persons_service router = APIRouter(prefix='/persons') @@ -30,7 +30,7 @@ async def create_person( ) -> models.Person: return persons_service.create(person) -@router.post('/batch', response_model=List[schemas.Person]) +@router.post('/batch', response_model=List[Person]) async def batch_list_persons( request: Dict = {}, persons_service: PersonService = Depends(get_persons_service) diff --git a/src/personal_info/services/__init__.py b/src/personal_info/services/__init__.py index 57565af..4e774c3 100644 --- a/src/personal_info/services/__init__.py +++ b/src/personal_info/services/__init__.py @@ -4,8 +4,12 @@ from sqlalchemy.orm import Session from personal_info.db.session import get_session from .persons import PersonService +from .addresses import AddressService def get_persons_service(db_session: Session = Depends(get_session)) -> PersonService: return PersonService(db_session) -__all__ = ('get_persons_service') \ No newline at end of file +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 diff --git a/src/personal_info/services/addresses.py b/src/personal_info/services/addresses.py new file mode 100644 index 0000000..08d8555 --- /dev/null +++ b/src/personal_info/services/addresses.py @@ -0,0 +1,9 @@ +from typing import Any, List, Dict +from sqlalchemy.orm import Session +from personal_info.db.schemas import (AddressCreateIn) +from personal_info.db import models +from personal_info.services.base import BaseService + +class AddressService(BaseService[models.Address, AddressCreateIn, Any]): + def __init__(self, db_session: Session): + super(AddressService, self).__init__(models.Address, db_session) \ No newline at end of file diff --git a/src/personal_info/services/persons.py b/src/personal_info/services/persons.py index 7e879ef..1e4b59e 100644 --- a/src/personal_info/services/persons.py +++ b/src/personal_info/services/persons.py @@ -1,7 +1,7 @@ from typing import Any, List, Dict from sqlalchemy.orm import Session - +from starlette.exceptions import HTTPException from personal_info.db.models import Person, Address, Document, Contact from personal_info.db.schemas import PersonCreate, PersonBase from personal_info.db import models