From 94667eee62aafe63089a09299b4bfc7997e2d889 Mon Sep 17 00:00:00 2001 From: Nikolay Shirokov Date: Tue, 28 Jul 2026 03:23:50 +0300 Subject: [PATCH] feat(api): add endpoints to render projects - get_by_id, get_user_render_projects, get_user_public_render_projects, create_render_project, delete_by_id --- app/api/api_v1/render_project.py | 81 ++++++++++++++++++++++++++++-- app/repositories/render_project.py | 1 + app/schemas/render_project.py | 22 ++++++-- app/services/render_project.py | 45 ++++++++++++++++- 4 files changed, 141 insertions(+), 8 deletions(-) diff --git a/app/api/api_v1/render_project.py b/app/api/api_v1/render_project.py index aa86dfd..a38eeb0 100644 --- a/app/api/api_v1/render_project.py +++ b/app/api/api_v1/render_project.py @@ -1,6 +1,10 @@ from dependencies.annotations import AuthUserByAccessTokenDep, RenderProjectServiceDep -from fastapi import APIRouter -from schemas.render_project import RenderProjectResponse +from fastapi import APIRouter, status +from schemas.render_project import ( + RenderProjectCreate, + RenderProjectResponse, + RenderProjectResponseList, +) router = APIRouter( prefix="/render-project", @@ -8,7 +12,11 @@ ) -@router.get("/{render_project_id}") +@router.get( + "/{render_project_id}", + response_model=RenderProjectResponse, + status_code=status.HTTP_200_OK, +) async def get_render_project( render_project_id: int, user_id: AuthUserByAccessTokenDep, @@ -18,3 +26,70 @@ async def get_render_project( render_project_id=render_project_id, user_id=user_id, ) + + +@router.get( + "/", + response_model=RenderProjectResponseList, + status_code=status.HTTP_200_OK, +) +async def get_current_user_render_projects( + render_project_service: RenderProjectServiceDep, + user_id: AuthUserByAccessTokenDep, + size: int = 10, + page: int = 1, +) -> RenderProjectResponseList: + return await render_project_service.get_user_render_projects( + user_id=user_id, + size=size, + page=page, + ) + + +@router.get( + "/{user_id}/public", + response_model=RenderProjectResponseList, + status_code=status.HTTP_200_OK, +) +async def get_user_public_render_projects( + render_project_service: RenderProjectServiceDep, + user_id: int, + size: int = 10, + page: int = 1, +) -> RenderProjectResponseList: + return await render_project_service.get_user_public_render_projects( + user_id=user_id, + size=size, + page=page, + ) + + +@router.post( + "/create", + response_model=RenderProjectResponse, + status_code=status.HTTP_201_CREATED, +) +async def create_render_project( + user_id: AuthUserByAccessTokenDep, + create_render_project_data: RenderProjectCreate, + render_project_service: RenderProjectServiceDep, +) -> RenderProjectResponse: + return await render_project_service.create_render_project( + user_id=user_id, + create_render_project=create_render_project_data, + ) + + +@router.delete( + "delete/{render_project_id}", + status_code=status.HTTP_204_NO_CONTENT, +) +async def delete_render_project( + render_project_id: int, + user_id: AuthUserByAccessTokenDep, + render_project_service: RenderProjectServiceDep, +) -> None: + return await render_project_service.delete_by_id( + render_project_id=render_project_id, + user_id=user_id, + ) diff --git a/app/repositories/render_project.py b/app/repositories/render_project.py index 602320b..e4ea124 100644 --- a/app/repositories/render_project.py +++ b/app/repositories/render_project.py @@ -1,3 +1,4 @@ + from core.constants import ProjectVisibility from core.interfaces.repositories import AbstractRenderProjectRepository from models import RenderProject, User diff --git a/app/schemas/render_project.py b/app/schemas/render_project.py index d5388f5..a59fd7c 100644 --- a/app/schemas/render_project.py +++ b/app/schemas/render_project.py @@ -1,5 +1,7 @@ -from core.constants import ProjectVisibility -from pydantic import BaseModel +from typing import ClassVar + +from core.constants import ProjectVisibility, RenderStatus +from pydantic import BaseModel, ConfigDict class RenderProjectBase(BaseModel): @@ -9,6 +11,8 @@ class RenderProjectBase(BaseModel): name: str description: str + source_file_id: int + model_config: ClassVar[ConfigDict] = ConfigDict(from_attributes=True) class RenderProjectCreate(RenderProjectBase): @@ -16,7 +20,6 @@ class RenderProjectCreate(RenderProjectBase): Схема для создания проекта. """ - source_file_id: int visibility: ProjectVisibility @@ -25,6 +28,17 @@ class RenderProjectResponse(RenderProjectBase): Схема для вывода информации о проекте. """ - render_file_id: int | None + render_file_id: int | None = None visibility: ProjectVisibility + status: RenderStatus id: int + + +class RenderProjectResponseList(BaseModel): + """ + Схема для вывода информации о списке проектов. + """ + + render_projects: list[RenderProjectResponse] + size: int + page: int diff --git a/app/services/render_project.py b/app/services/render_project.py index 66b058e..b5e4517 100644 --- a/app/services/render_project.py +++ b/app/services/render_project.py @@ -5,7 +5,11 @@ from core.exceptions.render_project import RenderProjectIdNotFoundError from core.interfaces.repositories import AbstractRenderProjectRepository from models import User -from schemas.render_project import RenderProjectCreate, RenderProjectResponse +from schemas.render_project import ( + RenderProjectCreate, + RenderProjectResponse, + RenderProjectResponseList, +) class RenderProjectService: @@ -39,6 +43,45 @@ async def get_by_id( return RenderProjectResponse.model_validate(render_project) + async def get_user_render_projects( + self, + user_id: int, + size: int, + page: int, + ) -> RenderProjectResponseList: + get_projects = self.render_project_repository.get_user_render_projects( + user_id, + ) + render_projects = [ + RenderProjectResponse.model_validate(render_project) + for render_project in await get_projects + ] + return RenderProjectResponseList( + render_projects=render_projects, + size=size, + page=page, + ) + + async def get_user_public_render_projects( + self, + user_id: int, + size: int, + page: int, + ) -> RenderProjectResponseList: + get_projects = self.render_project_repository.get_user_public_render_projects( + user_id, + ) + + render_projects = [ + RenderProjectResponse.model_validate(render_project) + for render_project in await get_projects + ] + return RenderProjectResponseList( + render_projects=render_projects, + size=size, + page=page, + ) + async def create_render_project( self, user_id: int,