import { putBackupScheduleSettingsSchema, putBackupStorageSettingsSchema } from "@mmapp/contracts/backups" import type { BackupScheduleForm, BackupStorageForm } from "@/components/backups/backups-settings" function integer(value: number | string, label: string, min: number, max: number): number { if (!/^[0-9]+$/.test(String(value))) throw new Error(label + ": введите целое число") const number = Number(value) if (!Number.isSafeInteger(number) || number < min || number > max) throw new Error(label + ": допустимо от " + min + " до " + max) return number } export function backupSchedulePayload(form: BackupScheduleForm, serverIds: string[], allEnabled: boolean) { if (!allEnabled && !serverIds.length) throw new Error("Выберите серверы или режим всех включённых устройств") if (form.enabled && form.format !== "rsc") throw new Error("Плановый binary backup пока не поддерживается; выберите .rsc явно") return putBackupScheduleSettingsSchema.parse({ ...form, hour: integer(form.hour, "Час", 0, 23), minute: integer(form.minute, "Минута", 0, 59), weekDay: integer(form.weekDay, "День недели", 0, 6), monthDay: integer(form.monthDay, "День месяца", 1, 28), keepCount: integer(form.keepCount, "Число копий", 1, 365), serverIds: allEnabled ? [] : serverIds }) } export function backupStoragePayload(form: BackupStorageForm, secretConfigured = false) { if (form.provider === "s3") { if (!form.s3Bucket.trim() || !form.s3AccessKeyId.trim()) throw new Error("Для S3 заполните Bucket и Access key") if (!form.s3SecretAccessKey.trim() && !secretConfigured) throw new Error("Для S3 требуется Secret key") if (form.s3SecretAccessKey && !form.s3SecretAccessKey.trim()) throw new Error("Secret key не может состоять только из пробелов") if (form.s3Endpoint) { let endpoint: URL try { endpoint = new URL(form.s3Endpoint) } catch { throw new Error("Endpoint должен быть полным URL http/https") } if (!["http:", "https:"].includes(endpoint.protocol)) throw new Error("Endpoint должен использовать http/https") } } return putBackupStorageSettingsSchema.parse({ provider: form.provider, s3Endpoint: form.s3Endpoint, s3Region: form.s3Region, s3Bucket: form.s3Bucket, s3Prefix: form.s3Prefix, s3AccessKeyId: form.s3AccessKeyId, s3SecretAccessKey: form.s3SecretAccessKey || undefined, s3ForcePathStyle: form.s3ForcePathStyle, keepLocalCopy: form.keepLocalCopy }) }