Files

83 lines
2.1 KiB
Python
Raw Permalink Normal View History

2026-03-09 17:32:11 +08:00
"""
文件锁 API 路由
接入 FileLockService 服务,管理文件的排他锁
2026-03-09 17:32:11 +08:00
"""
from fastapi import APIRouter
from pydantic import BaseModel
from typing import Optional
from dataclasses import asdict
2026-03-09 17:32:11 +08:00
from ..services.file_lock import get_file_lock_service
2026-03-09 17:32:11 +08:00
router = APIRouter()
2026-03-09 17:32:11 +08:00
class LockAcquireRequest(BaseModel):
2026-03-09 17:32:11 +08:00
file_path: str
agent_id: str
agent_name: Optional[str] = ""
2026-03-09 17:32:11 +08:00
class LockReleaseRequest(BaseModel):
file_path: str
agent_id: str
2026-03-09 17:32:11 +08:00
@router.get("")
2026-03-09 17:32:11 +08:00
@router.get("/")
async def list_locks():
"""获取所有文件锁列表"""
service = get_file_lock_service()
locks = await service.get_locks()
return {
"locks": [
{
"file_path": lock.file_path,
"agent_id": lock.agent_id,
"agent_name": lock.agent_name,
"acquired_at": lock.acquired_at,
"elapsed_display": lock.elapsed_display
}
for lock in locks
]
}
2026-03-09 17:32:11 +08:00
@router.post("/acquire")
async def acquire_lock(request: LockAcquireRequest):
2026-03-09 17:32:11 +08:00
"""获取文件锁"""
service = get_file_lock_service()
success = await service.acquire_lock(
file_path=request.file_path,
agent_id=request.agent_id,
agent_name=request.agent_name or ""
)
if success:
return {"success": True, "message": "Lock acquired"}
return {"success": False, "message": "File already locked by another agent"}
2026-03-09 17:32:11 +08:00
@router.post("/release")
async def release_lock(request: LockReleaseRequest):
2026-03-09 17:32:11 +08:00
"""释放文件锁"""
service = get_file_lock_service()
success = await service.release_lock(
file_path=request.file_path,
agent_id=request.agent_id
)
if success:
return {"success": True, "message": "Lock released"}
return {"success": False, "message": "Lock not found or not owned by this agent"}
2026-03-09 17:32:11 +08:00
@router.get("/check")
async def check_lock(file_path: str):
"""检查文件锁定状态"""
service = get_file_lock_service()
locked_by = await service.check_locked(file_path)
return {
"file_path": file_path,
"locked": locked_by is not None,
"locked_by": locked_by
}