diff --git a/apps/dokploy/components/dashboard/database/backups/add-backup.tsx b/apps/dokploy/components/dashboard/database/backups/add-backup.tsx index c4920730..8fe2a976 100644 --- a/apps/dokploy/components/dashboard/database/backups/add-backup.tsx +++ b/apps/dokploy/components/dashboard/database/backups/add-backup.tsx @@ -58,7 +58,36 @@ import { z } from "zod"; type CacheType = "cache" | "fetch"; -const AddPostgresBackup1Schema = z.object({ +const getMetadataSchema = ( + backupType: "database" | "compose", + databaseType: Props["databaseType"], +) => { + if (backupType !== "compose") return z.object({}).optional(); + + const schemas = { + postgres: z.object({ + databaseUser: z.string().min(1, "Database user is required"), + }), + mariadb: z.object({ + databaseUser: z.string().min(1, "Database user is required"), + databasePassword: z.string().min(1, "Database password is required"), + }), + mongo: z.object({ + databaseUser: z.string().min(1, "Database user is required"), + databasePassword: z.string().min(1, "Database password is required"), + }), + mysql: z.object({ + databaseRootPassword: z.string().min(1, "Root password is required"), + }), + "web-server": z.object({}), + }; + + return z.object({ + [databaseType]: schemas[databaseType], + }); +}; + +const Schema = z.object({ destinationId: z.string().min(1, "Destination required"), schedule: z.string().min(1, "Schedule (Cron) required"), prefix: z.string().min(1, "Prefix required"), @@ -68,7 +97,7 @@ const AddPostgresBackup1Schema = z.object({ serviceName: z.string().nullable(), }); -type AddPostgresBackup = z.infer; +type Schema = z.infer; interface Props { id: string; @@ -89,7 +118,11 @@ export const AddBackup = ({ const { mutateAsync: createBackup, isLoading: isCreatingPostgresBackup } = api.backup.create.useMutation(); - const form = useForm({ + const schema = Schema.extend({ + metadata: getMetadataSchema(backupType, databaseType), + }); + + const form = useForm>({ defaultValues: { database: "", destinationId: "", @@ -98,8 +131,9 @@ export const AddBackup = ({ schedule: "", keepLatestCount: undefined, serviceName: null, + metadata: {}, }, - resolver: zodResolver(AddPostgresBackup1Schema), + resolver: zodResolver(schema), }); const { @@ -128,10 +162,11 @@ export const AddBackup = ({ schedule: "", keepLatestCount: undefined, serviceName: null, + metadata: {}, }); }, [form, form.reset, form.formState.isSubmitSuccessful, databaseType]); - const onSubmit = async (data: AddPostgresBackup) => { + const onSubmit = async (data: Schema) => { if (backupType === "compose" && !data.serviceName) { form.setError("serviceName", { type: "manual", @@ -489,6 +524,115 @@ export const AddBackup = ({ )} /> + {backupType === "compose" && ( + <> + {databaseType === "postgres" && ( + ( + + Database User + + + + + + )} + /> + )} + + {databaseType === "mariadb" && ( + <> + ( + + Database User + + + + + + )} + /> + ( + + Database Password + + + + + + )} + /> + + )} + + {databaseType === "mongo" && ( + <> + ( + + Database User + + + + + + )} + /> + ( + + Database Password + + + + + + )} + /> + + )} + + {databaseType === "mysql" && ( + ( + + Root Password + + + + + + )} + /> + )} + + )}