From fe677719247afdaa62c9ba43b7239b7baf669c1b Mon Sep 17 00:00:00 2001 From: andrei Date: Sun, 2 Mar 2025 17:09:28 +0500 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D0=BB=D0=BE=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D1=8B=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=20=D0=BB=D0=B8=D0=BD=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/application/lens_issues_repository.py | 27 ++++++ api/app/controllers/lens_issues_router.py | 38 +++++++++ api/app/domain/entities/lens_issues.py | 13 +++ api/app/infrastructure/lens_issues_service.py | 85 +++++++++++++++++++ api/app/infrastructure/lenses_service.py | 3 +- api/app/main.py | 2 + 6 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 api/app/application/lens_issues_repository.py create mode 100644 api/app/controllers/lens_issues_router.py create mode 100644 api/app/domain/entities/lens_issues.py create mode 100644 api/app/infrastructure/lens_issues_service.py diff --git a/api/app/application/lens_issues_repository.py b/api/app/application/lens_issues_repository.py new file mode 100644 index 0000000..5948297 --- /dev/null +++ b/api/app/application/lens_issues_repository.py @@ -0,0 +1,27 @@ +from typing import Optional, Sequence + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.domain.models import LensIssue + + +class LensIssuesRepository: + def __init__(self, db: AsyncSession): + self.db = db + + async def get_all(self) -> Sequence[LensIssue]: + stmt = select(LensIssue) + result = await self.db.execute(stmt) + return result.scalars().all() + + async def get_by_id(self, lens_issue_id: int) -> Optional[LensIssue]: + stmt = select(LensIssue).filter(LensIssue.id == lens_issue_id) + result = await self.db.execute(stmt) + return result.scalars().first() + + async def create(self, lens_issue: LensIssue) -> LensIssue: + self.db.add(lens_issue) + await self.db.commit() + await self.db.refresh(lens_issue) + return lens_issue diff --git a/api/app/controllers/lens_issues_router.py b/api/app/controllers/lens_issues_router.py new file mode 100644 index 0000000..e5da17a --- /dev/null +++ b/api/app/controllers/lens_issues_router.py @@ -0,0 +1,38 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession + +from app.database.session import get_db +from app.domain.entities.lens_issues import LensIssueEntity +from app.infrastructure.dependencies import get_current_user +from app.infrastructure.lens_issues_service import LensIssuesService + +router = APIRouter() + + +@router.get( + "/lens_issues/", + response_model=list[LensIssueEntity], + summary="Get all lens issues", + description="Returns a list of all lens issues", +) +async def get_all_lens_issues( + db: AsyncSession = Depends(get_db), + user=Depends(get_current_user), +): + lens_issues_service = LensIssuesService(db) + return await lens_issues_service.get_all_lens_issues() + + +@router.post( + "/lens_issues/", + response_model=LensIssueEntity, + summary="Create lens issue", + description="Creates a new lens issue", +) +async def create_lens_issue( + lens_issue: LensIssueEntity, + db: AsyncSession = Depends(get_db), + user=Depends(get_current_user), +): + lens_issues_service = LensIssuesService(db) + return await lens_issues_service.create_lens_issue(lens_issue, user.id) diff --git a/api/app/domain/entities/lens_issues.py b/api/app/domain/entities/lens_issues.py new file mode 100644 index 0000000..bcb1819 --- /dev/null +++ b/api/app/domain/entities/lens_issues.py @@ -0,0 +1,13 @@ +import datetime +from typing import Optional + +from pydantic import BaseModel + + +class LensIssueEntity(BaseModel): + id: Optional[int] = None + issue_date: datetime.date + + patient_id: int + doctor_id: Optional[int] = None + lens_id: int diff --git a/api/app/infrastructure/lens_issues_service.py b/api/app/infrastructure/lens_issues_service.py new file mode 100644 index 0000000..6174f5e --- /dev/null +++ b/api/app/infrastructure/lens_issues_service.py @@ -0,0 +1,85 @@ +from typing import Optional + +from fastapi import HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from starlette import status + +from app.application.lens_issues_repository import LensIssuesRepository +from app.application.lenses_repository import LensesRepository +from app.application.patients_repository import PatientsRepository +from app.application.users_repository import UsersRepository +from app.domain.entities.lens_issues import LensIssueEntity +from app.domain.models import LensIssue + + +class LensIssuesService: + def __init__(self, db: AsyncSession): + self.lens_issues_repository = LensIssuesRepository(db) + self.patient_repository = PatientsRepository(db) + self.users_repository = UsersRepository(db) + self.lenses_repository = LensesRepository(db) + + async def get_all_lens_issues(self) -> list[LensIssueEntity]: + lens_issues = await self.lens_issues_repository.get_all() + + return [ + self.model_to_entity(lens_issue) + for lens_issue in lens_issues + ] + + async def create_lens_issue(self, lens_issue: LensIssueEntity, user_id: int) -> LensIssueEntity: + patient = await self.patient_repository.get_by_id(lens_issue.patient_id) + + if not patient: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='The patient with this ID was not found', + ) + + user = await self.users_repository.get_by_id(user_id) + + if not user: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='The user with this ID was not found', + ) + + lens_issue.doctor_id = user_id + + lens = await self.lenses_repository.get_by_id(lens_issue.lens_id) + + if not lens: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='The lens with this ID was not found', + ) + + lens_issue_model = self.entity_to_model(lens_issue) + + await self.lens_issues_repository.create(lens_issue_model) + + return self.model_to_entity(lens_issue_model) + + @staticmethod + def entity_to_model(lens_issue: LensIssueEntity) -> LensIssue: + lens_issue_model = LensIssue( + issue_date=lens_issue.issue_date, + patient_id=lens_issue.patient_id, + doctor_id=lens_issue.doctor_id, + lens_id=lens_issue.lens_id, + ) + + if lens_issue.id is not None: + lens_issue_model.id = lens_issue.id + + return lens_issue_model + + @staticmethod + def model_to_entity(lens_issue_model: LensIssue) -> LensIssueEntity: + return LensIssueEntity( + id=lens_issue_model.id, + issue_date=lens_issue_model.issue_date, + patient_id=lens_issue_model.patient_id, + doctor_id=lens_issue_model.doctor_id, + lens_id=lens_issue_model.lens_id, + ) diff --git a/api/app/infrastructure/lenses_service.py b/api/app/infrastructure/lenses_service.py index 897599c..c499dca 100644 --- a/api/app/infrastructure/lenses_service.py +++ b/api/app/infrastructure/lenses_service.py @@ -80,7 +80,6 @@ class LensesService: @staticmethod def entity_to_model(lens: LensEntity) -> Lens: - try: side_enum = SideEnum(lens.side) except ValueError: @@ -102,7 +101,7 @@ class LensesService: ) if lens.id is not None: - lens.id = lens.id + lens_model.id = lens.id return lens_model diff --git a/api/app/main.py b/api/app/main.py index 3fee108..087d77d 100644 --- a/api/app/main.py +++ b/api/app/main.py @@ -2,6 +2,7 @@ from fastapi import FastAPI from starlette.middleware.cors import CORSMiddleware from app.controllers.auth_router import router as auth_router +from app.controllers.lens_issues_router import router as lens_issues_router from app.controllers.lens_types_router import router as lens_types_router from app.controllers.lenses_router import router as lenses_router from app.controllers.patients_router import router as patients_router @@ -29,6 +30,7 @@ def start_app(): api_app.include_router(lens_types_router, prefix=settings.APP_PREFIX, tags=['lens_types']) api_app.include_router(sets_router, prefix=settings.APP_PREFIX, tags=['sets']) api_app.include_router(set_content_router, prefix=settings.APP_PREFIX, tags=['set_content']) + api_app.include_router(lens_issues_router, prefix=settings.APP_PREFIX, tags=['lens_issue']) return api_app