Spaces:
Running
Running
| from __future__ import annotations | |
| from uuid import UUID, uuid4 | |
| from fastapi import APIRouter, Depends, Request, status | |
| from shared.schemas.pagination import PaginatedResponse, PaginationParams | |
| from shared.schemas.project import DashboardStats, Project, ProjectCreate | |
| from shared.schemas.scene import Scene | |
| from app.api.access import project_readable_by_user | |
| from app.api.deps import ContentStore, get_content_store, get_request_user_id | |
| from app.core.limiter import limiter | |
| router = APIRouter(tags=["projects"]) | |
| def create_project( | |
| request: Request, | |
| body: ProjectCreate, | |
| user_id: UUID = Depends(get_request_user_id), # noqa: B008 | |
| store: ContentStore = Depends(get_content_store), # noqa: B008 | |
| ) -> Project: | |
| return store.create_project( | |
| project_id=uuid4(), | |
| user_id=user_id, | |
| title=body.title, | |
| description=body.description, | |
| source_language=body.source_language, | |
| target_scenes=body.target_scenes, | |
| config=body.config or {}, | |
| status="draft", | |
| ) | |
| def list_projects( | |
| params: PaginationParams = Depends(), # noqa: B008 | |
| user_id: UUID = Depends(get_request_user_id), # noqa: B008 | |
| store: ContentStore = Depends(get_content_store), # noqa: B008 | |
| ) -> PaginatedResponse[Project]: | |
| items, total = store.list_projects_for_user(user_id, limit=params.limit, offset=params.offset) | |
| return PaginatedResponse( | |
| items=items, | |
| total=total, | |
| page=params.page, | |
| limit=params.limit, | |
| pages=(total + params.limit - 1) // params.limit, | |
| ) | |
| def get_dashboard_stats( | |
| user_id: UUID = Depends(get_request_user_id), # noqa: B008 | |
| store: ContentStore = Depends(get_content_store), # noqa: B008 | |
| ) -> DashboardStats: | |
| return store.get_dashboard_stats(user_id) | |
| def get_project( | |
| project_id: UUID, | |
| user_id: UUID = Depends(get_request_user_id), # noqa: B008 | |
| store: ContentStore = Depends(get_content_store), # noqa: B008 | |
| ) -> Project: | |
| return project_readable_by_user(store, project_id, user_id) | |
| def delete_project( | |
| project_id: UUID, | |
| user_id: UUID = Depends(get_request_user_id), # noqa: B008 | |
| store: ContentStore = Depends(get_content_store), # noqa: B008 | |
| ) -> None: | |
| project_readable_by_user(store, project_id, user_id) | |
| store.delete_project(project_id) | |
| def list_project_scenes( | |
| project_id: UUID, | |
| params: PaginationParams = Depends(), # noqa: B008 | |
| user_id: UUID = Depends(get_request_user_id), # noqa: B008 | |
| store: ContentStore = Depends(get_content_store), # noqa: B008 | |
| ) -> PaginatedResponse[Scene]: | |
| project_readable_by_user(store, project_id, user_id) | |
| items, total = store.list_scenes_for_project( | |
| project_id, limit=params.limit, offset=params.offset | |
| ) | |
| return PaginatedResponse( | |
| items=items, | |
| total=total, | |
| page=params.page, | |
| limit=params.limit, | |
| pages=(total + params.limit - 1) // params.limit, | |
| ) | |