|
1 | 1 | """Router for project management.""" |
2 | 2 |
|
| 3 | +import os |
3 | 4 | from fastapi import APIRouter, HTTPException, Path, Body |
4 | 5 | from typing import Optional |
5 | 6 |
|
@@ -32,40 +33,47 @@ async def get_project_info( |
32 | 33 | @project_router.patch("/{name}", response_model=ProjectStatusResponse) |
33 | 34 | async def update_project( |
34 | 35 | project_service: ProjectServiceDep, |
35 | | - project_name: str = Path(..., description="Name of the project to update"), |
36 | | - path: Optional[str] = Body(None, description="New path for the project"), |
| 36 | + name: str = Path(..., description="Name of the project to update"), |
| 37 | + path: Optional[str] = Body(None, description="New absolute path for the project"), |
37 | 38 | is_active: Optional[bool] = Body(None, description="Status of the project (active/inactive)"), |
38 | 39 | ) -> ProjectStatusResponse: |
39 | 40 | """Update a project's information in configuration and database. |
40 | 41 |
|
41 | 42 | Args: |
42 | | - project_name: The name of the project to update |
43 | | - path: Optional new path for the project |
| 43 | + name: The name of the project to update |
| 44 | + path: Optional new absolute path for the project |
44 | 45 | is_active: Optional status update for the project |
45 | 46 |
|
46 | 47 | Returns: |
47 | 48 | Response confirming the project was updated |
48 | 49 | """ |
49 | | - try: # pragma: no cover |
| 50 | + try: |
| 51 | + # Validate that path is absolute if provided |
| 52 | + if path and not os.path.isabs(path): |
| 53 | + raise HTTPException(status_code=400, detail="Path must be absolute") |
| 54 | + |
50 | 55 | # Get original project info for the response |
51 | 56 | old_project_info = ProjectItem( |
52 | | - name=project_name, |
53 | | - path=project_service.projects.get(project_name, ""), |
| 57 | + name=name, |
| 58 | + path=project_service.projects.get(name, ""), |
54 | 59 | ) |
55 | 60 |
|
56 | | - await project_service.update_project(project_name, updated_path=path, is_active=is_active) |
| 61 | + if path: |
| 62 | + await project_service.move_project(name, path) |
| 63 | + elif is_active is not None: |
| 64 | + await project_service.update_project(name, is_active=is_active) |
57 | 65 |
|
58 | 66 | # Get updated project info |
59 | | - updated_path = path if path else project_service.projects.get(project_name, "") |
| 67 | + updated_path = path if path else project_service.projects.get(name, "") |
60 | 68 |
|
61 | 69 | return ProjectStatusResponse( |
62 | | - message=f"Project '{project_name}' updated successfully", |
| 70 | + message=f"Project '{name}' updated successfully", |
63 | 71 | status="success", |
64 | | - default=(project_name == project_service.default_project), |
| 72 | + default=(name == project_service.default_project), |
65 | 73 | old_project=old_project_info, |
66 | | - new_project=ProjectItem(name=project_name, path=updated_path), |
| 74 | + new_project=ProjectItem(name=name, path=updated_path), |
67 | 75 | ) |
68 | | - except ValueError as e: # pragma: no cover |
| 76 | + except ValueError as e: |
69 | 77 | raise HTTPException(status_code=400, detail=str(e)) |
70 | 78 |
|
71 | 79 |
|
|
0 commit comments