28 lines
2.6 KiB
TypeScript
28 lines
2.6 KiB
TypeScript
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 })
|
|
}
|