Files
MikrotikManager/lib/certificate-issue-checkpoint.ts

21 lines
1.5 KiB
TypeScript

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<typeof certificateIssueCheckpointSchema>
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 }