from fastapi import APIRouter, Depends, HTTPException from models.project import Project from models.user import User from pydantic import BaseModel from services.project_service import project_service from routers.auth import get_current_user router = APIRouter() class CreateProjectRequest(BaseModel): title: str description: str = "" class UpdateProjectRequest(BaseModel): title: str | None = None description: str | None = None @router.get("/projects", response_model=list[Project]) async def get_all_projects(current_user: User = Depends(get_current_user)): """Получить все проекты текущего пользователя""" return project_service.get_all_projects(user_id=current_user.id) @router.get("/projects/{project_id}", response_model=Project) async def get_project(project_id: str, current_user: User = Depends(get_current_user)): """Получить проект по ID""" project = project_service.get_project(project_id) if not project: raise HTTPException(status_code=404, detail="Project not found") if project.user_id != current_user.id: raise HTTPException(status_code=403, detail="Access denied") return project @router.post("/projects", response_model=Project, status_code=201) async def create_project( request: CreateProjectRequest, current_user: User = Depends(get_current_user) ): """Создать новый проект""" return project_service.create_project( title=request.title, user_id=current_user.id, description=request.description, ) @router.put("/projects/{project_id}", response_model=Project) async def update_project( project_id: str, request: UpdateProjectRequest, current_user: User = Depends(get_current_user), ): """Обновить проект""" project = project_service.get_project(project_id) if not project: raise HTTPException(status_code=404, detail="Project not found") if project.user_id != current_user.id: raise HTTPException(status_code=403, detail="Access denied") updated = project_service.update_project( project_id=project_id, title=request.title, description=request.description, ) if not updated: raise HTTPException(status_code=404, detail="Project not found") return updated @router.delete("/projects/{project_id}") async def delete_project( project_id: str, current_user: User = Depends(get_current_user) ): """Удалить проект""" try: success = project_service.delete_project(project_id, current_user.id) if not success: raise HTTPException(status_code=404, detail="Project not found") return {"status": "deleted", "project_id": project_id} except ValueError as e: raise HTTPException(status_code=403, detail=str(e))