Files
insar-management-system-v2/backend/app/routers/ops_maintenance.py
T

100 lines
2.9 KiB
Python

from __future__ import annotations
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Query, Request
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db
from ..models import AuthUserORM
from ..services.ops_maintenance_service import ops_maintenance_service
from .dependencies import _add_operation_audit_log, _get_current_user, _require_admin
router = APIRouter(prefix="/ops-maintenance", tags=["ops-maintenance"])
class CleanupRequest(BaseModel):
confirm: bool = False
delete_landsar_work_dir: bool = True
@router.get("/tasks")
async def list_maintenance_tasks(
task_type: Optional[str] = Query(default=None),
status: Optional[str] = Query(default=None),
limit: int = Query(default=50, ge=1, le=200),
offset: int = Query(default=0, ge=0),
_user: AuthUserORM = Depends(_get_current_user),
db: AsyncSession = Depends(get_db),
):
return await ops_maintenance_service.list_tasks(
db,
task_type=task_type,
status=status,
limit=limit,
offset=offset,
)
@router.get("/tasks/{task_id}/diagnosis")
async def diagnose_maintenance_task(
task_id: str,
_user: AuthUserORM = Depends(_get_current_user),
db: AsyncSession = Depends(get_db),
):
diagnosis = await ops_maintenance_service.diagnose_task(db, task_id)
if diagnosis is None:
raise HTTPException(status_code=404, detail="Task not found.")
return diagnosis
@router.post("/tasks/{task_id}/cleanup-preview")
async def preview_maintenance_cleanup(
task_id: str,
_user: AuthUserORM = Depends(_get_current_user),
db: AsyncSession = Depends(get_db),
):
preview = await ops_maintenance_service.cleanup_preview(db, task_id)
if preview is None:
raise HTTPException(status_code=404, detail="Task not found.")
return preview
@router.post("/tasks/{task_id}/cleanup")
async def cleanup_maintenance_task(
task_id: str,
request_body: CleanupRequest,
request: Request,
admin_user: AuthUserORM = Depends(_require_admin),
db: AsyncSession = Depends(get_db),
):
if not request_body.confirm:
raise HTTPException(status_code=400, detail="Cleanup confirmation is required.")
try:
result = await ops_maintenance_service.cleanup_task(
db,
task_id,
options=request_body.model_dump(),
)
except ValueError as exc:
raise HTTPException(status_code=409, detail=str(exc)) from exc
if result is None:
raise HTTPException(status_code=404, detail="Task not found.")
await _add_operation_audit_log(
db,
request,
action="ops_task_cleanup",
resource=f"ops-maintenance/tasks/{task_id}",
detail={
"task_id": task_id,
"options": request_body.model_dump(),
"result": result,
},
user=admin_user,
)
await db.commit()
return result