15 lines
1.4 KiB
TypeScript
15 lines
1.4 KiB
TypeScript
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<typeof backupJobCheckpointSchema>
|
|
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 }
|