diff --git a/main.py b/main.py index 4c22a7f..f05069f 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,9 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from starlette.staticfiles import StaticFiles -origins = ["http://localhost:5173"] +import routes + +origins = ["http://localhost:3000"] app = FastAPI(separate_input_output_schemas=False) @@ -15,7 +17,9 @@ app.add_middleware( allow_headers=["*"], ) -routers_list = [] +routers_list = [ + routes.project_router, +] for router in routers_list: app.include_router(router) diff --git a/repositories/__init__.py b/repositories/__init__.py index e69de29..3d898e9 100644 --- a/repositories/__init__.py +++ b/repositories/__init__.py @@ -0,0 +1 @@ +from .project import ProjectRepository as ProjectRepository diff --git a/repositories/project.py b/repositories/project.py new file mode 100644 index 0000000..9503613 --- /dev/null +++ b/repositories/project.py @@ -0,0 +1,14 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from models.project import Project + + +class ProjectRepository: + def __init__(self, session: AsyncSession): + self.session = session + + async def get_all(self) -> list[Project]: + stmt = select(Project).where(Project.is_deleted.is_(False)) + result = await self.session.execute(stmt) + return list(result.scalars().all()) diff --git a/routes/__init__.py b/routes/__init__.py index e69de29..dc12938 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -0,0 +1 @@ +from .project import project_router as project_router diff --git a/routes/project.py b/routes/project.py new file mode 100644 index 0000000..12d8ee0 --- /dev/null +++ b/routes/project.py @@ -0,0 +1,21 @@ +from fastapi import APIRouter + +from backend.dependecies import SessionDependency +from schemas.project import GetProjectsResponse +from services.project import ProjectService + +project_router = APIRouter( + prefix="/project", + tags=["project"], +) + + +@project_router.get( + "/", + response_model=GetProjectsResponse, + operation_id="get_projects", +) +async def get_projects( + session: SessionDependency, +): + return await ProjectService(session).get_projects() diff --git a/schemas/base.py b/schemas/base.py index cdabfaf..a5cd20e 100644 --- a/schemas/base.py +++ b/schemas/base.py @@ -31,11 +31,6 @@ class BaseSchema(BaseModel): return [cls.model_validate(model) for model in sql_models] -class OkMessageSchema(BaseSchema): - ok: bool - message: str - - class PaginationSchema(BaseSchema): page: int | None = None items_per_page: int | None = None diff --git a/schemas/project.py b/schemas/project.py new file mode 100644 index 0000000..3b25302 --- /dev/null +++ b/schemas/project.py @@ -0,0 +1,29 @@ +from schemas.base import BaseSchema + + +# region Entity + + +class BaseProjectSchema(BaseSchema): + name: str + + +class ProjectSchema(BaseProjectSchema): + id: int + + +# endregion + +# region Requests + + +# endregion + +# region Responses + + +class GetProjectsResponse(BaseSchema): + projects: list[ProjectSchema] + + +# endregion Responses diff --git a/services/__init__.py b/services/__init__.py index e69de29..f20d044 100644 --- a/services/__init__.py +++ b/services/__init__.py @@ -0,0 +1 @@ +from .project import ProjectService as ProjectService diff --git a/services/project.py b/services/project.py new file mode 100644 index 0000000..da9dfe1 --- /dev/null +++ b/services/project.py @@ -0,0 +1,15 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from repositories.project import ProjectRepository +from schemas.project import GetProjectsResponse, ProjectSchema + + +class ProjectService: + def __init__(self, session: AsyncSession): + self.repository = ProjectRepository(session) + + async def get_projects(self) -> GetProjectsResponse: + projects = await self.repository.get_all() + return GetProjectsResponse( + projects=[ProjectSchema.model_validate(project) for project in projects] + )