diff --git a/src/lib/helpers/backups.ts b/src/lib/helpers/backups.ts index a597b7902..b452eeb0b 100644 --- a/src/lib/helpers/backups.ts +++ b/src/lib/helpers/backups.ts @@ -10,6 +10,7 @@ export type UserBackupPolicy = { checked?: boolean; selectedTime?: string; plainTextFrequency?: string; + weeklySelectedDays?: string[]; monthlyBackupFrequency?: string; }; @@ -47,7 +48,16 @@ export const cronExpression = (policy: UserBackupPolicy) => { if (policy.plainTextFrequency === 'daily') { cronExpression = `${utcMinute} ${utcHour} * * *`; } else if (policy.plainTextFrequency === 'weekly') { - cronExpression = `${utcMinute} ${utcHour} * * 1`; + const selectedDays = policy.weeklySelectedDays + ?.map( + (dayLabel) => + backupFrequencies.weekly.find((option) => option.label === dayLabel)?.index + ) + .filter((index) => index !== undefined) + .join(','); + + // Default to Monday (1) + cronExpression = `${utcMinute} ${utcHour} * * ${selectedDays || '1'}`; } else if (policy.plainTextFrequency === 'monthly') { cronExpression = `${utcMinute} ${utcHour} 28 * *`; } @@ -94,7 +104,8 @@ export const backupPolicyDescription = ( frequency: string, time: string | null = null, retained: number | null = null, - monthlyBackupFrequency: string + monthlyBackupFrequency: string, + weeklySelectedDays: string[] | null = null ) => { const timeFormatted = time ? formatTime24to12(time) : ''; let retainedText = ''; @@ -127,10 +138,16 @@ export const backupPolicyDescription = ( ? `Runs every day and is retained for ${retainedText}.` : `A backup will run daily at ${timeFormatted}.`; - case 'weekly': + case 'weekly': { + const daysArray = weeklySelectedDays || ['Monday']; + const dayString = + daysArray.length > 1 + ? daysArray.slice(0, -1).join(', ') + ' and ' + daysArray.slice(-1) + : daysArray[0]; return retained !== null - ? `Runs every Monday and is retained for ${retainedText}.` - : `A backup will run weekly on Monday at ${timeFormatted}.`; + ? `Runs every ${dayString} and is retained for ${retainedText}.` + : `A backup will run weekly on ${dayString} at ${timeFormatted}.`; + } case 'monthly': { const monthDay = diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte index 0eb91a65c..06381e224 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte +++ b/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte @@ -5,8 +5,10 @@ Helper, InputCheckbox, InputSelect, + InputSelectCheckbox, InputText, - InputTime + InputTime, + Label } from '$lib/elements/forms'; import { ID } from '@appwrite.io/console'; import { capitalize } from '$lib/helpers/string'; @@ -42,6 +44,8 @@ let policyNameError: boolean; let policyFrequency = 'monthly'; let monthlyBackupFrequency = 'end'; + + $: daysSelectionArray = []; $: backupPolicyName = `${capitalize(policyFrequency)} backup`; $: customRetentionEnabled = policyRetention === -1; @@ -51,9 +55,9 @@ policyInEdit = null; policyRetention = 30; selectedTime = '00:00'; + daysSelectionArray = []; policyFrequency = 'monthly'; monthlyBackupFrequency = 'end'; - customRetentionEnabled = false; }; @@ -73,9 +77,13 @@ retained: policyRetention, id: policyInEdit ?? ID.unique(), plainTextFrequency: policyFrequency, + weeklySelectedDays: daysSelectionArray, + // placeholder description. description: `Runs every ${policyFrequency} and is retained for ${policyRetention}` }; + userBackupPolicy.description = customPolicyDescription(userBackupPolicy); + listOfCustomPolicies = [...listOfCustomPolicies, userBackupPolicy]; resetFormVariables(); @@ -100,12 +108,19 @@ policy.plainTextFrequency, null, policy.retained, - policy.monthlyBackupFrequency + policy.monthlyBackupFrequency, + policy.weeklySelectedDays ); }; $: formPolicyDescription = () => { - return backupPolicyDescription(policyFrequency, selectedTime, null, monthlyBackupFrequency); + return backupPolicyDescription( + policyFrequency, + selectedTime, + null, + monthlyBackupFrequency, + daysSelectionArray + ); }; $: if (showCustomPolicy) { @@ -187,6 +202,7 @@ policyFrequency = policy.plainTextFrequency; monthlyBackupFrequency = policy.monthlyBackupFrequency; + daysSelectionArray = policy.weeklySelectedDays; // do not show in the list can cause confusion. listOfCustomPolicies = [ @@ -252,15 +268,31 @@ placeholder="End of month (28th)" fullWidth options={backupFrequencies[policyFrequency]} /> + {:else if policyFrequency === 'weekly'} +