"""Operator artwork handling: final files, and the uploads that carry them. These reuse the customer upload routes with the operator's derived identity, so one transport serves both and there is only one place where parts are signed. """ from uuid import UUID from fastapi import APIRouter, Depends, HTTPException from ..core import db from ..artwork import submit_files from ..core.auth import operator from ..core.models import ArtworkSubmission, UploadStart from ..runtime import file_rows, operator_identity from .uploads import begin_upload, complete_upload, part_url, upload_status router = APIRouter() @router.post('/api/operator/orders/{oid}/uploads') def begin_final(oid: UUID, body: UploadStart, user=Depends(operator)): with db.connect() as c: row = c.execute('SELECT state FROM dtf_local.orders WHERE id=%s', (oid,)).fetchone() if not row: raise HTTPException(404, 'Order not found') if row['state'] not in ('rec','tra','cor'): raise HTTPException(409, 'Order is not in artwork review') return begin_upload(body, session_id=operator_identity(user)) @router.get('/api/operator/uploads/{uid}') def final_status(uid: UUID, user=Depends(operator)): return upload_status(uid,session_id=operator_identity(user)) @router.post('/api/operator/uploads/{uid}/parts/{number}') def final_part(uid: UUID, number: int, user=Depends(operator)): return part_url(uid,number,session_id=operator_identity(user)) @router.post('/api/operator/uploads/{uid}/complete') def final_complete(uid: UUID, user=Depends(operator)): return complete_upload(uid,session_id=operator_identity(user)) @router.get('/api/operator/orders/{oid}/files') def operator_files(oid: UUID, user=Depends(operator)): with db.connect() as c: return file_rows(c,oid) @router.post('/api/operator/orders/{oid}/final-files') def final_files(oid: UUID, body: ArtworkSubmission, user=Depends(operator)): with db.connect() as c: order = c.execute('SELECT * FROM dtf_local.orders WHERE id=%s FOR UPDATE', (oid,)).fetchone() if not order: raise HTTPException(404, 'Order not found') return submit_files(c,order,body,operator_identity(user),'final',user)