Files
multiAgentTry/backend/app/routers/locks.py

83 lines
2.1 KiB
Python
Raw Normal View History

"""
文件锁 API 路由
接入 FileLockService 服务管理文件的排他锁
"""
from fastapi import APIRouter
from pydantic import BaseModel
from typing import Optional
from dataclasses import asdict
from ..services.file_lock import get_file_lock_service
router = APIRouter()
class LockAcquireRequest(BaseModel):
file_path: str
agent_id: str
agent_name: Optional[str] = ""
class LockReleaseRequest(BaseModel):
file_path: str
agent_id: str
@router.get("")
@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
]
}
@router.post("/acquire")
async def acquire_lock(request: LockAcquireRequest):
"""获取文件锁"""
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"}
@router.post("/release")
async def release_lock(request: LockReleaseRequest):
"""释放文件锁"""
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"}
@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
}