diff --git a/apps/api/app/api/routes/projects.py b/apps/api/app/api/routes/projects.py old mode 100644 new mode 100755 index 7e8e502b0..3cfa6f359 --- a/apps/api/app/api/routes/projects.py +++ b/apps/api/app/api/routes/projects.py @@ -12,6 +12,7 @@ from fastapi import APIRouter, Depends, HTTPException, status from packages.application import ( CreateProjectCommand, CreateProjectUseCase, + DeleteProjectUseCase, GetProjectUseCase, ListProjectsUseCase, ) @@ -39,6 +40,8 @@ def get_project( project = use_case.execute(project_id) if project is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found") + if not project.can_access(authenticated_user.user.id): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Access denied to project") return _to_project_response(project) @@ -67,3 +70,22 @@ def create_project( owner_user_id=authenticated_user.user.id, ) return _to_project_response(project) + + +@router.delete("/{project_id}") +def delete_project( + project_id: str, + authenticated_user: AuthenticatedUser = Depends(get_current_user), + project_repository: Any = Depends(get_project_repository), +): + use_case = DeleteProjectUseCase(project_repository) + try: + deleted = use_case.execute(project_id, authenticated_user.user.id) + except PermissionError: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Only the project owner can delete this project", + ) + if not deleted: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found") + return {"message": "Project deleted successfully"} \ No newline at end of file diff --git a/packages/application/projects.py b/packages/application/projects.py old mode 100644 new mode 100755 index 842c97eb7..84235c26c --- a/packages/application/projects.py +++ b/packages/application/projects.py @@ -61,6 +61,19 @@ class ShareProjectUseCase: return project +class DeleteProjectUseCase: + def __init__(self, project_repository: ProjectRepository): + self.project_repository = project_repository + + def execute(self, project_id: str, user_id: str) -> bool: + project = self.project_repository.find_by_id(project_id) + if not project: + return False + if not project.is_owner(user_id): + raise PermissionError("只有项目所有者可以删除项目") + return self.project_repository.delete(project_id) + + class UnshareProjectUseCase: def __init__(self, project_repository: ProjectRepository): self.project_repository = project_repository