From f0510de5e914326d1dd0b9b73d9976c827a31a43 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 6 Mar 2025 18:14:38 +0530 Subject: [PATCH 1/2] improve: reduce calls to backend on free plans for policy check. --- src/lib/stores/database.ts | 23 ++++++---- .../project-[project]/databases/+page.ts | 29 ++++++++++--- .../database-[database]/backups/+page.ts | 43 +++++++++++-------- 3 files changed, 61 insertions(+), 34 deletions(-) diff --git a/src/lib/stores/database.ts b/src/lib/stores/database.ts index efec8fed1..7ce2f1697 100644 --- a/src/lib/stores/database.ts +++ b/src/lib/stores/database.ts @@ -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); diff --git a/src/routes/(console)/project-[project]/databases/+page.ts b/src/routes/(console)/project-[project]/databases/+page.ts index 216194f28..b5c8ce6dc 100644 --- a/src/routes/(console)/project-[project]/databases/+page.ts +++ b/src/routes/(console)/project-[project]/databases/+page.ts @@ -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, policies: Record; + + if (isCloud && backupsEnabled) { + [policies, lastBackups] = await Promise.all([ + await fetchPolicies(databases), + await fetchLastBackups(databases) + ]); + } return { databases, policies, lastBackups }; } diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts b/src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts index 6014bbc28..3cba41ca4 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts +++ b/src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts @@ -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); From 7caf89214544a457ee2c2881897b2f6248b26e56 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 6 Mar 2025 18:28:05 +0530 Subject: [PATCH 2/2] address comment: remove `await`. --- src/routes/(console)/project-[project]/databases/+page.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[project]/databases/+page.ts b/src/routes/(console)/project-[project]/databases/+page.ts index b5c8ce6dc..50fc415b4 100644 --- a/src/routes/(console)/project-[project]/databases/+page.ts +++ b/src/routes/(console)/project-[project]/databases/+page.ts @@ -49,8 +49,8 @@ async function fetchDatabasesAndBackups(limit: number, offset: number, currentPl if (isCloud && backupsEnabled) { [policies, lastBackups] = await Promise.all([ - await fetchPolicies(databases), - await fetchLastBackups(databases) + fetchPolicies(databases), + fetchLastBackups(databases) ]); }