import { z } from "zod" import { certificateIssueRequestSchema, certificateIssueJobSchema, type CertificateIssueRequest } from "@mmapp/contracts/certificates" export const certificateIssueCheckpointSchema = z.object({ request: certificateIssueRequestSchema.extend({ requestId: z.string().uuid() }), accepted: z.boolean(), job: certificateIssueJobSchema.nullable(), }).superRefine((value, ctx) => { const job = value.job, request = value.request if (job && (job.id !== request.requestId || job.serverId !== String(request.serverId) || job.certName !== request.certName || JSON.stringify(job.domainNames) !== JSON.stringify(request.domainNames))) ctx.addIssue({ code: "custom", message: "Сохранённая задача относится к другой цели" }) if (job && !value.accepted) ctx.addIssue({ code: "custom", message: "Наблюдение задачи не подтверждает принятие запроса" }) }) export type CertificateIssueCheckpoint = z.infer export function createCertificateIssueCheckpoint(request: CertificateIssueRequest, requestId: string) { return certificateIssueCheckpointSchema.parse({ request: { ...request, requestId }, accepted: false, job: null }) } export function readCertificateIssueCheckpoint(raw: string | null) { return raw === null ? null : certificateIssueCheckpointSchema.parse(JSON.parse(raw)) } export function certificateIssueStorageKey(backendUrl: string) { return "mmapp:certificate-issue:" + backendUrl }