import { NextResponse } from 'next/server'; import { withAuth, withPermission } from '@/lib/api/helpers'; import { errorResponse } from '@/lib/errors'; import { getPortDocumensoConfig } from '@/lib/services/port-config'; import { getEoiTemplateSyncReport } from '@/lib/services/documenso-template-sync.service'; /** * GET `/api/v1/documents/signing-defaults` * * Returns the per-port developer + approver defaults the * UploadForSigningDialog uses to prefill the recipient configurator. * No secrets are exposed - just the display name, email, and the * sendMode flag so the UI can show the right CTA copy ("Send now" vs * "Save draft, send manually"). * * Permission: documents.send_for_signing - the only caller is the * upload-for-signing dialog which already requires this permission to * complete the flow. */ export const GET = withAuth( withPermission('documents', 'send_for_signing', async (_req, ctx) => { try { const cfg = await getPortDocumensoConfig(ctx.portId); // Signing order resolution chain (highest → lowest priority): // 1. Cached `documento_eoi_template_sync_report.templateMeta.signingOrder` // - populated by the admin "Sync from Documenso" button and // represents the live template's bound order. On v2 this is the // authoritative value because `/template/use` doesn't accept a // per-call override. // 2. Per-port `documenso_signing_order` setting from // getPortDocumensoConfig (used by v1 + as a UI fallback when the // admin hasn't run a sync yet). // 3. Documenso's own default (`PARALLEL` = concurrent signing). const syncReport = await getEoiTemplateSyncReport(ctx.portId).catch(() => null); const signingOrder: 'PARALLEL' | 'SEQUENTIAL' = syncReport?.templateMeta?.signingOrder ?? cfg.signingOrder ?? 'PARALLEL'; return NextResponse.json({ data: { developer: { name: cfg.developerName ?? '', email: cfg.developerEmail ?? '', label: cfg.developerLabel ?? 'Developer', }, approver: { name: cfg.approverName ?? '', email: cfg.approverEmail ?? '', label: cfg.approverLabel ?? 'Approver', }, sendMode: cfg.sendMode, signingOrder, // Surface where the value came from so the UI tooltip can be // honest about the source. Helps reps debug "I changed it in // Documenso but the CRM still says X" - they need to re-run // Sync to pull the change. signingOrderSource: syncReport?.templateMeta?.signingOrder ? 'template' : cfg.signingOrder ? 'port-setting' : 'default', }, }); } catch (error) { return errorResponse(error); } }), );