import { z } from "zod" import { backupJobResponseSchema, createBackupRequestSchema } from "@mmapp/contracts/backups" import type { CreateBackupRequest } from "@mmapp/contracts/backups" const requestSchema = createBackupRequestSchema.extend({ requestId: z.string().uuid() }) export const backupJobCheckpointSchema = z.object({ request: requestSchema, accepted: z.boolean(), job: backupJobResponseSchema.nullable() }).superRefine((value, ctx) => { const job = value.job if (job && (!value.accepted || job.id !== value.request.requestId || JSON.stringify(job.serverIds) !== JSON.stringify(value.request.serverIds.map(String)) || (job.notes ?? "") !== (value.request.notes ?? ""))) ctx.addIssue({ code: "custom", message: "Наблюдение относится к другой задаче" }) }) export type BackupJobCheckpoint = z.infer export function createBackupJobCheckpoint(request: CreateBackupRequest, requestId: string): BackupJobCheckpoint { return backupJobCheckpointSchema.parse({ request: { ...request, requestId, serverIds: request.serverIds.map(String), notes: request.notes?.trim() || undefined }, accepted: false, job: null }) } export function readBackupJobCheckpoint(value: string | null): BackupJobCheckpoint | null { return value ? backupJobCheckpointSchema.parse(JSON.parse(value)) : null } export function backupJobStorageKey(backendUrl: string) { return "mmapp:backup-job:" + backendUrl }