admin / Synapse-Cortex
publicSelf Hosted ITSM Tool with RBAC/Tenanting and MFA
Synapse-Cortex / synapse-cortex / app / routers / sla_policies.py
2246 B · main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import uuid from typing import Optional from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from .. import models, schemas from ..audit import log_audit from ..database import get_db from ..deps import get_session_user router = APIRouter(prefix="/api/v1/sla-policies", tags=["sla-policies"]) ADMIN_ROLES = (models.UserRole.GLOBAL_ADMIN, models.UserRole.TENANT_ADMIN) @router.get("", response_model=list[schemas.SLAPolicyOut]) def list_sla_policies( db: Session = Depends(get_db), user: Optional[models.User] = Depends(get_session_user), ): if not user: raise HTTPException(status.HTTP_401_UNAUTHORIZED) return ( db.query(models.SLAPolicy) .filter(models.SLAPolicy.tenant_id == user.tenant_id) .order_by(models.SLAPolicy.priority) .all() ) @router.patch("/{policy_id}", response_model=schemas.SLAPolicyOut) def update_sla_policy( policy_id: uuid.UUID, payload: schemas.SLAPolicyUpdate, db: Session = Depends(get_db), user: Optional[models.User] = Depends(get_session_user), ): if not user: raise HTTPException(status.HTTP_401_UNAUTHORIZED) if user.role not in ADMIN_ROLES: raise HTTPException(status.HTTP_403_FORBIDDEN, detail="Admin privileges required") policy = ( db.query(models.SLAPolicy) .filter(models.SLAPolicy.id == policy_id, models.SLAPolicy.tenant_id == user.tenant_id) .first() ) if not policy: raise HTTPException(status.HTTP_404_NOT_FOUND) old_response, old_resolution = policy.response_time_minutes, policy.resolution_time_minutes policy.response_time_minutes = payload.response_time_minutes policy.resolution_time_minutes = payload.resolution_time_minutes log_audit( db, tenant_id=user.tenant_id, user_id=user.id, action="sla_policy_update", detail={ "priority": policy.priority.value, "response_time_minutes": {"old": old_response, "new": payload.response_time_minutes}, "resolution_time_minutes": {"old": old_resolution, "new": payload.resolution_time_minutes}, }, ) db.commit() db.refresh(policy) return policy |