""" Projects Versioning API - Handles version history and restoration. """ from typing import Any, cast from fastapi import APIRouter, Depends, HTTPException from src.server.schemas.projects import ( CreateVersionRequest, RestoreVersionRequest, ) from src.server.services.projects.versioning_service import VersioningService from src.server.utils.api_utils import handle_service_result from ...auth.dependencies import get_current_user router = APIRouter() def _err(res: Any, code: int = 500): detail = res.get("error", res) if isinstance(res, dict) else res raise HTTPException(status_code=code, detail=detail) @router.get("/versions") async def list_all_versions(current_user: dict = Depends(get_current_user)): u_role = current_user.get("role", "member").lower() if u_role not in ["system_admin", "admin", "manager"]: _err("Forbidden", 403) s, res = VersioningService().list_all_versions() if not s or not isinstance(res, dict): _err(res) return res.get("versions", []) @router.get("/projects/{project_id}/versions") async def list_project_versions( project_id: str, field_name: str | None = None, current_user: dict = Depends(get_current_user) ): s, res = VersioningService().list_versions(project_id, field_name) if not s: _err(res, 404 if "not found" in str(res).lower() else 500) return res @router.post("/projects/{project_id}/versions") async def create_project_version( project_id: str, req: CreateVersionRequest, current_user: dict = Depends(get_current_user) ): s, res = VersioningService().create_version(project_id=project_id, **req.model_dump()) return { "message": "Version created successfully", "version": cast(dict[str, Any], handle_service_result(s, res)).get("version"), } @router.post("/projects/{project_id}/versions/{field_name}/{version_number}/restore") async def restore_project_version( project_id: str, field_name: str, version_number: int, req: RestoreVersionRequest, current_user: dict = Depends(get_current_user), ): s, res = VersioningService().restore_version( project_id=project_id, field_name=field_name, version_number=version_number, **req.model_dump() ) return { "message": f"Successfully restored {field_name} to version {version_number}", **cast(dict[str, Any], handle_service_result(s, res)), }