From ae18a3841a45f72f6877d86645b1e8a4a678cf6a Mon Sep 17 00:00:00 2001 From: dderbentsov Date: Thu, 3 Aug 2023 01:21:17 +0300 Subject: [PATCH] VIP Person Batch query --- src/personal_info/db/schemas/person.py | 20 +++++++++++++------- src/personal_info/routers/persons.py | 13 ++++++++++--- src/personal_info/services/persons.py | 14 ++++++++++---- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/personal_info/db/schemas/person.py b/src/personal_info/db/schemas/person.py index 69f7225..a280efb 100644 --- a/src/personal_info/db/schemas/person.py +++ b/src/personal_info/db/schemas/person.py @@ -4,14 +4,7 @@ from typing import List, Optional from pydantic import BaseModel, Field, ConfigDict from pydantic.types import UUID4 -class Person(BaseModel): - id: UUID4 - first_name: str - last_name: str - patronymic: Optional[str] - class Config: - orm_mode = True class PersonBase(BaseModel): first_name: str @@ -56,6 +49,19 @@ class PersonCreate(PersonBase): photos: Optional[List[str]] = [] + + +class Person(BaseModel): + id: UUID4 + first_name: str + last_name: str + patronymic: Optional[str] + birth_date: Optional[date] + contacts: Optional[List[ContactCreate]] = [] + + class Config: + orm_mode = True + class PersonDetail(Person): id: UUID4 first_name: str diff --git a/src/personal_info/routers/persons.py b/src/personal_info/routers/persons.py index ae6d307..0f86b62 100644 --- a/src/personal_info/routers/persons.py +++ b/src/personal_info/routers/persons.py @@ -1,9 +1,9 @@ from fastapi import Depends, Request from fastapi.routing import APIRouter from pydantic.types import UUID4 -from typing import List, Optional +from typing import List, Optional, Dict -from personal_info.db import models +from personal_info.db import models, schemas from personal_info.db.schemas import Person, PersonDetail, PersonCreate from personal_info.services import PersonService, get_persons_service @@ -28,4 +28,11 @@ async def get_person( async def create_person( person: PersonCreate, persons_service: PersonService = Depends(get_persons_service) ) -> models.Person: - return persons_service.create(person) \ No newline at end of file + return persons_service.create(person) + +@router.post('/batch', response_model=List[schemas.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/services/persons.py b/src/personal_info/services/persons.py index 0ce8b9d..7e879ef 100644 --- a/src/personal_info/services/persons.py +++ b/src/personal_info/services/persons.py @@ -1,10 +1,10 @@ -from typing import Any, List +from typing import Any, List, Dict from sqlalchemy.orm import Session from personal_info.db.models import Person, Address, Document, Contact from personal_info.db.schemas import PersonCreate, PersonBase - +from personal_info.db import models from personal_info.services.base import BaseService class PersonService(BaseService[Person, PersonCreate, Any]): @@ -19,8 +19,6 @@ class PersonService(BaseService[Person, PersonCreate, Any]): return objs def create(self, obj: PersonCreate) -> Person: - print('= raw' * 3 ) - print(obj) person_obj = PersonBase(**obj.dict()) person = super(PersonService, self).create(person_obj) @@ -44,3 +42,11 @@ class PersonService(BaseService[Person, PersonCreate, Any]): return person + def batch_get(self, request: Dict) -> List[models.Person]: + + if request["ids"] is None: + HTTPException(status_code=404, detail='ids required') + + objs: List[models.Person] = self.db_session.query(models.Person).filter(models.Person.id.in_(request["ids"])).all() + + return objs \ No newline at end of file