Merge pull request #1729 from appwrite/fix-backup-calls

Reduce calls to Backups endpoints
This commit is contained in:
Darshan
2025-03-06 19:09:55 +05:30
committed by GitHub
3 changed files with 61 additions and 34 deletions
+14 -9
View File
@@ -1,10 +1,12 @@
import { derived, writable } from 'svelte/store';
import { derived, get, writable } from 'svelte/store';
import { page } from '$app/stores';
import { type Models, Query } from '@appwrite.io/console';
import { sdk } from '$lib/stores/sdk';
import { headerAlert } from '$lib/stores/headerAlert';
import BackupDatabase from '$lib/components/backupDatabaseAlert.svelte';
import { shouldShowNotification } from '$lib/helpers/notifications';
import { isCloud } from '$lib/system';
import { currentPlan } from '$lib/stores/organization';
export const database = derived(page, ($page) => $page.data?.database as Models.Database);
@@ -17,16 +19,19 @@ export async function checkForDatabaseBackupPolicies(database: Models.Database)
if (!shouldShowNotification(backupsBannerId)) return;
let total = 0;
const backupsEnabled = get(currentPlan)?.backupsEnabled ?? true;
try {
const policies = await sdk.forProject.backups.listPolicies([
Query.limit(1),
Query.equal('resourceId', database.$id)
]);
if (isCloud && backupsEnabled) {
try {
const policies = await sdk.forProject.backups.listPolicies([
Query.limit(1),
Query.equal('resourceId', database.$id)
]);
total = policies.total;
} catch (e) {
// ignore, backups not allowed on free plan error.
total = policies.total;
} catch (e) {
// ignore, backups not allowed on free plan error.
}
}
showPolicyAlert.set(total <= 0);
@@ -5,8 +5,10 @@ import { type Models, Query } from '@appwrite.io/console';
import { timeFromNow } from '$lib/helpers/date';
import type { PageLoad } from './$types';
import type { BackupPolicy } from '$lib/sdk/backups';
import { isCloud } from '$lib/system';
import type { Plan } from '$lib/sdk/billing';
export const load: PageLoad = async ({ url, route, depends }) => {
export const load: PageLoad = async ({ url, route, depends, parent }) => {
depends(Dependencies.DATABASES);
const page = getPage(url);
@@ -14,7 +16,14 @@ export const load: PageLoad = async ({ url, route, depends }) => {
const view = getView(url, route, View.Grid);
const offset = pageToOffset(page, limit);
const { databases, policies, lastBackups } = await fetchDatabasesAndBackups(limit, offset);
// already loaded by parent.
const { currentPlan } = await parent();
const { databases, policies, lastBackups } = await fetchDatabasesAndBackups(
limit,
offset,
currentPlan
);
return {
offset,
@@ -27,17 +36,23 @@ export const load: PageLoad = async ({ url, route, depends }) => {
};
// TODO: @itznotabug we should improve this!
async function fetchDatabasesAndBackups(limit: number, offset: number) {
async function fetchDatabasesAndBackups(limit: number, offset: number, currentPlan?: Plan) {
const backupsEnabled = currentPlan?.backupsEnabled ?? true;
const databases = await sdk.forProject.databases.list([
Query.limit(limit),
Query.offset(offset),
Query.orderDesc('$createdAt')
]);
const [policies, lastBackups] = await Promise.all([
await fetchPolicies(databases),
await fetchLastBackups(databases)
]);
let lastBackups: Record<string, string>, policies: Record<string, BackupPolicy[]>;
if (isCloud && backupsEnabled) {
[policies, lastBackups] = await Promise.all([
fetchPolicies(databases),
fetchLastBackups(databases)
]);
}
return { databases, policies, lastBackups };
}
@@ -3,8 +3,9 @@ import { CARD_LIMIT, Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
import { Query } from '@appwrite.io/console';
import type { BackupArchive, BackupArchiveList, BackupPolicyList } from '$lib/sdk/backups';
import { isCloud } from '$lib/system';
export const load = async ({ params, url, route, depends }) => {
export const load = async ({ params, url, route, depends, parent }) => {
depends(Dependencies.BACKUPS);
const page = getPage(url);
const limit = getLimit(url, route, CARD_LIMIT);
@@ -14,24 +15,30 @@ export const load = async ({ params, url, route, depends }) => {
let backups: BackupArchiveList = { total: 0, archives: [] };
let policies: BackupPolicyList = { total: 0, policies: [] };
try {
[backups, policies] = await Promise.all([
sdk.forProject.backups.listArchives([
Query.limit(limit),
Query.offset(offset),
Query.orderDesc('$createdAt'),
Query.equal('resourceType', 'database'),
Query.equal('resourceId', params.database)
]),
// already loaded by parent.
const { currentPlan } = await parent();
const backupsEnabled = currentPlan?.backupsEnabled ?? true;
sdk.forProject.backups.listPolicies([
Query.orderDesc('$createdAt'),
Query.equal('resourceType', 'database'),
Query.equal('resourceId', params.database)
])
]);
} catch (e) {
// ignore
if (isCloud && backupsEnabled) {
try {
[backups, policies] = await Promise.all([
sdk.forProject.backups.listArchives([
Query.limit(limit),
Query.offset(offset),
Query.orderDesc('$createdAt'),
Query.equal('resourceType', 'database'),
Query.equal('resourceId', params.database)
]),
sdk.forProject.backups.listPolicies([
Query.orderDesc('$createdAt'),
Query.equal('resourceType', 'database'),
Query.equal('resourceId', params.database)
])
]);
} catch (e) {
// ignore
}
}
const archivesByPolicy = groupArchivesByPolicy(backups.archives);