from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.core.database import get_db from app.core.security import ApiPrincipal, require_api_key from app.modules.writebacks.constants import WritebackResponseKey from app.modules.writebacks.schemas import WritebackCreateRequest, WritebackSubmitRequest from app.modules.writebacks.service import WritebackService router = APIRouter(dependencies=[Depends(require_api_key)]) @router.get("") def list_writebacks( status: str | None = None, limit: int = Query(default=100, ge=1, le=500), db: Session = Depends(get_db), ) -> dict: return { WritebackResponseKey.ITEMS: WritebackService(db).list_runs( status_filter=status, limit=limit, ) } @router.post("") def create_writeback( payload: WritebackCreateRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return { WritebackResponseKey.DATA: WritebackService(db).create_run( domain=payload.domain, record_id=payload.record_id, action=payload.action, payload=payload.payload, actor=principal.actor, idempotency_key=payload.idempotency_key, ) } @router.get("/{code}") def get_writeback( code: str, db: Session = Depends(get_db), ) -> dict: return {WritebackResponseKey.DATA: WritebackService(db).get_run(code)} @router.post("/{code}/submit") def submit_writeback( code: str, payload: WritebackSubmitRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return { WritebackResponseKey.DATA: WritebackService(db).submit_run( code, approval_ticket_id=payload.approval_ticket_id, actor=principal.actor, ) }