feat: get projects endpoint

This commit is contained in:
2025-08-03 10:34:54 +04:00
parent 3e51d26c65
commit 8ef265cd45
9 changed files with 88 additions and 7 deletions

View File

@ -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)

View File

@ -0,0 +1 @@
from .project import ProjectRepository as ProjectRepository

14
repositories/project.py Normal file
View File

@ -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())

View File

@ -0,0 +1 @@
from .project import project_router as project_router

21
routes/project.py Normal file
View File

@ -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()

View File

@ -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

29
schemas/project.py Normal file
View File

@ -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

View File

@ -0,0 +1 @@
from .project import ProjectService as ProjectService

15
services/project.py Normal file
View File

@ -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]
)