|
1 | 1 | """Router for project management.""" |
2 | 2 |
|
3 | 3 | import os |
4 | | -from fastapi import APIRouter, HTTPException, Path, Body |
| 4 | +from fastapi import APIRouter, HTTPException, Path, Body, BackgroundTasks |
5 | 5 | from typing import Optional |
| 6 | +from loguru import logger |
6 | 7 |
|
7 | | -from basic_memory.deps import ProjectServiceDep, ProjectPathDep |
8 | | -from basic_memory.schemas import ProjectInfoResponse |
| 8 | +from basic_memory.deps import ( |
| 9 | + ProjectConfigDep, |
| 10 | + ProjectServiceDep, |
| 11 | + ProjectPathDep, |
| 12 | + SyncServiceDep, |
| 13 | +) |
| 14 | +from basic_memory.schemas import ProjectInfoResponse, SyncReportResponse |
9 | 15 | from basic_memory.schemas.project_info import ( |
10 | 16 | ProjectList, |
11 | 17 | ProjectItem, |
@@ -97,6 +103,54 @@ async def update_project( |
97 | 103 | raise HTTPException(status_code=400, detail=str(e)) |
98 | 104 |
|
99 | 105 |
|
| 106 | +# Sync project filesystem |
| 107 | +@project_router.post("/sync") |
| 108 | +async def sync_project( |
| 109 | + background_tasks: BackgroundTasks, |
| 110 | + sync_service: SyncServiceDep, |
| 111 | + project_config: ProjectConfigDep, |
| 112 | +): |
| 113 | + """Force project filesystem sync to database. |
| 114 | +
|
| 115 | + Scans the project directory and updates the database with any new or modified files. |
| 116 | +
|
| 117 | + Args: |
| 118 | + background_tasks: FastAPI background tasks |
| 119 | + sync_service: Sync service for this project |
| 120 | + project_config: Project configuration |
| 121 | +
|
| 122 | + Returns: |
| 123 | + Response confirming sync was initiated |
| 124 | + """ |
| 125 | + background_tasks.add_task(sync_service.sync, project_config.home, project_config.name) |
| 126 | + logger.info(f"Filesystem sync initiated for project: {project_config.name}") |
| 127 | + |
| 128 | + return { |
| 129 | + "status": "sync_started", |
| 130 | + "message": f"Filesystem sync initiated for project '{project_config.name}'", |
| 131 | + } |
| 132 | + |
| 133 | + |
| 134 | +@project_router.post("/status", response_model=SyncReportResponse) |
| 135 | +async def project_sync_status( |
| 136 | + sync_service: SyncServiceDep, |
| 137 | + project_config: ProjectConfigDep, |
| 138 | +) -> SyncReportResponse: |
| 139 | + """Scan directory for changes compared to database state. |
| 140 | +
|
| 141 | + Args: |
| 142 | + sync_service: Sync service for this project |
| 143 | + project_config: Project configuration |
| 144 | +
|
| 145 | + Returns: |
| 146 | + Scan report with details on files that need syncing |
| 147 | + """ |
| 148 | + logger.info(f"Scanning filesystem for project: {project_config.name}") |
| 149 | + sync_report = await sync_service.scan(project_config.home) |
| 150 | + |
| 151 | + return SyncReportResponse.from_sync_report(sync_report) |
| 152 | + |
| 153 | + |
100 | 154 | # List all available projects |
101 | 155 | @project_resource_router.get("/projects", response_model=ProjectList) |
102 | 156 | async def list_projects( |
@@ -259,7 +313,7 @@ async def get_default_project( |
259 | 313 |
|
260 | 314 |
|
261 | 315 | # Synchronize projects between config and database |
262 | | -@project_resource_router.post("/sync", response_model=ProjectStatusResponse) |
| 316 | +@project_resource_router.post("/config/sync", response_model=ProjectStatusResponse) |
263 | 317 | async def synchronize_projects( |
264 | 318 | project_service: ProjectServiceDep, |
265 | 319 | ) -> ProjectStatusResponse: |
|
0 commit comments