You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.3 KiB
Python

# backend/app/routers/approvals.py
from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session, select
from ..approvals import service
from ..auth.deps import current_user
from ..db import get_session
from ..models import Approval, ApprovalLog, Person
from ..schemas import (
ApprovalLogOut,
ApprovalOut,
ApprovalQueueOut,
AutonomyOut,
AutonomyPatch,
)
router = APIRouter() # prefix 없음. main.py 에서 prefix="/api" 등록.
SAVED_TODAY = "47분" # 원본 approve-data.js savedToday
AUTO_COUNT_NIGHT = 7 # 원본 autoCountNight
def _out(a: Approval) -> ApprovalOut:
return ApprovalOut(
id=a.id,
icon=a.icon,
tone=a.tone,
risk=a.risk,
time=a.time,
title=a.title,
detail=a.detail,
cta=a.cta,
alt=a.alt,
undo_label=a.undo_label,
status=a.status,
source=a.source,
rule_id=a.rule_id,
sort_order=a.sort_order,
)
@router.get("/approvals", response_model=ApprovalQueueOut)
def get_queue(s: Session = Depends(get_session), user: Person = Depends(current_user)):
q = service.derive_queue(s, user_id=user.id)
logs = s.exec(select(ApprovalLog).order_by(ApprovalLog.sort_order)).all()
return ApprovalQueueOut(
autonomy=q["level"],
saved_today=SAVED_TODAY,
auto_count_night=AUTO_COUNT_NIGHT,
pending=[_out(a) for a in q["pending"]],
done=[_out(a) for a in q["done"]],
log=[
ApprovalLogOut(id=log.id, time=log.time, text=log.text, approval_id=log.approval_id)
for log in logs
],
badges_appr=len(q["pending"]),
)
@router.post("/approvals/approve-all")
def approve_all(s: Session = Depends(get_session)):
return {"approved": service.approve_all(s)}
@router.get("/approvals/autonomy", response_model=AutonomyOut)
def get_autonomy(s: Session = Depends(get_session)):
return AutonomyOut(level=service.get_autonomy(s))
@router.get("/approvals/{aid}", response_model=ApprovalOut)
def get_one(aid: str, s: Session = Depends(get_session)):
a = s.get(Approval, aid)
if not a:
raise HTTPException(404, "approval not found")
return _out(a)
@router.patch("/approvals/autonomy", response_model=AutonomyOut)
def set_autonomy(body: AutonomyPatch, s: Session = Depends(get_session)):
try:
return AutonomyOut(level=service.set_autonomy(s, body.level))
except ValueError as e:
raise HTTPException(422, str(e)) from e
@router.post("/approvals/{aid}/approve", response_model=ApprovalOut)
def approve(aid: str, s: Session = Depends(get_session)):
if not s.get(Approval, aid):
raise HTTPException(404, "approval not found")
return _out(service.approve(s, aid))
@router.post("/approvals/{aid}/execute", response_model=ApprovalOut)
def execute(aid: str, s: Session = Depends(get_session)):
if not s.get(Approval, aid):
raise HTTPException(404, "approval not found")
return _out(service.approve(s, aid)) # high-risk cta 실행 = approve 와 동일 전이
@router.post("/approvals/{aid}/undo", response_model=ApprovalOut)
def undo(aid: str, s: Session = Depends(get_session)):
if not s.get(Approval, aid):
raise HTTPException(404, "approval not found")
return _out(service.undo(s, aid))