Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
470b047
feat: add Premium Geo DB addon to project settings
lohanidamodar Apr 18, 2026
5954b75
feat(settings): show price in premium geo DB enable dialog
lohanidamodar Apr 19, 2026
7e73d36
update sdk
lohanidamodar Apr 19, 2026
0e53210
feat(billing): render project addons in breakdown + use server addon …
lohanidamodar Apr 19, 2026
66e615e
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Apr 20, 2026
afb13fc
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Apr 21, 2026
13b0478
chore: bump @appwrite.io/console SDK to 95547fc
lohanidamodar Apr 23, 2026
0cba797
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Apr 23, 2026
6fc000f
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Apr 26, 2026
304142c
chore: keep @appwrite.io/console@95547fc for premium geo DB SDK methods
lohanidamodar Apr 26, 2026
67566db
Revert "chore: keep @appwrite.io/console@95547fc for premium geo DB S…
lohanidamodar Apr 26, 2026
e5a62c5
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Apr 30, 2026
a54c530
chore: update console SDK to 352239b
lohanidamodar Apr 30, 2026
4376702
merge main
lohanidamodar May 4, 2026
da68f75
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar May 4, 2026
0889ace
feat(settings): rewrite Premium Geo DB card description to focus on d…
lohanidamodar May 6, 2026
6fbdd43
feat(settings): tighten Premium Geo DB card copy to outcome-focused v…
lohanidamodar May 7, 2026
1ba8ebd
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar May 11, 2026
f8d2816
chore: update console SDK to 634f110
lohanidamodar May 11, 2026
afecbd2
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar May 12, 2026
60838e0
fix(settings): handle 3DS redirect + replace cancel/retry with refres…
lohanidamodar May 12, 2026
279737d
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar May 13, 2026
51ad756
fix: rename Models.Locale to Models.CloudLocale after SDK bump
lohanidamodar May 17, 2026
bd9d958
Merge main into feat/project-premium-geo-db-addon
lohanidamodar May 19, 2026
5b1b4fd
Bump console SDK to @2642dc5 (current cloud HEAD)
lohanidamodar May 19, 2026
0983d4c
Bump console SDK to @dd8e255
lohanidamodar Jun 25, 2026
bdf38af
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Jun 25, 2026
e185cbd
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Jul 7, 2026
300f3ce
fix(premiumGeoDB): handle 3DS PaymentAuthentication in re-enable flow
lohanidamodar Jul 7, 2026
a02d9cc
fix(billing): friendly label for premium geo addon in project breakdown
lohanidamodar Jul 7, 2026
411810b
chore(deps): bump @appwrite.io/console SDK to 051c615
lohanidamodar Jul 9, 2026
7c33c93
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Jul 9, 2026
42df78d
chore(deps): bump @appwrite.io/console SDK to 68c295a
lohanidamodar Jul 9, 2026
641e67f
Merge remote-tracking branch 'origin/main' into feat/project-premium-…
lohanidamodar Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
"@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@4b3ae78",
"@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@68c295a",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,9 @@
// on the resource entry. Once the cloud rollout is complete this map can
// be removed entirely.
const billingAddonNamesFallback: Record<string, string> = {
addon_baa: 'HIPAA BAA'
addon_baa: 'HIPAA BAA',
addon_premiumGeoDB: 'Premium Geo DB',
addon_premiumGeoDBOrg: 'Premium Geo DB'
};

const addons = (currentAggregation?.resources || [])
Expand Down Expand Up @@ -466,6 +468,21 @@
priceFormatter: ({ amount }) => formatCurrency(amount),
includeProgress: false
}),
...resources
.filter((r) => r.resourceId?.startsWith('addon_') && (r.amount ?? 0) > 0)
.map((addon) =>
createRow({
id: `addon-${addon.resourceId}`,
label:
addon.name ||
billingAddonNamesFallback[addon.resourceId] ||
addon.resourceId,
resource: addon,
usageFormatter: ({ value }) => formatNum(value),
priceFormatter: ({ amount }) => formatCurrency(amount),
includeProgress: false
})
),
Comment thread
lohanidamodar marked this conversation as resolved.
createRow({
id: 'usage-details',
label: `<a href="${base}/project-${String(projectData.region || 'default')}-${projectData.$id}/settings/usage" style="text-decoration: underline; color: var(--fgcolor-accent-neutral);">Usage details</a>`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
import UpdateVariables from '../updateVariables.svelte';
import { page } from '$app/state';
import UpdateLabels from './updateLabels.svelte';
import PremiumGeoDB from './premiumGeoDB.svelte';
import UpdateOAuth2Server from './updateOAuth2Server.svelte';
import { isCloud } from '$lib/system';
import type { PageData } from './$types';
import { Alert } from '@appwrite.io/pink-svelte';
import { flags } from '$lib/flags';
Expand Down Expand Up @@ -104,6 +106,9 @@
{/if}
<UpdateServices />
<UpdateInstallations {...data.installations} limit={data.limit} offset={data.offset} />
{#if isCloud && $canWriteProjects}
<PremiumGeoDB addons={data.addons} addonPrice={data.addonPrice} />
{/if}
<UpdateVariables
{sdkCreateVariable}
{sdkUpdateVariable}
Expand Down
47 changes: 33 additions & 14 deletions src/routes/(console)/project-[region]-[project]/settings/+page.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Dependencies, PAGE_LIMIT } from '$lib/constants';
import { isCloud } from '$lib/system';
import { sdk } from '$lib/stores/sdk';
import { Query } from '@appwrite.io/console';
import { Addon, Query } from '@appwrite.io/console';
import type { PageLoad } from './$types';

function isReadonlySettingsPermissionError(error: unknown): boolean {
Expand All @@ -11,26 +12,41 @@ function isReadonlySettingsPermissionError(error: unknown): boolean {
export const load: PageLoad = async ({ depends, url, params }) => {
depends(Dependencies.PROJECT_VARIABLES);
depends(Dependencies.PROJECT_INSTALLATIONS);
depends(Dependencies.ADDONS);

const limit = PAGE_LIMIT;
const offset = Number(url.searchParams.get('offset') ?? 0);
const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0);
const projectSdk = sdk.forProject(params.region, params.project);
const [variablesResult, installationsResult] = await Promise.allSettled([
projectSdk.projectApi.listVariables({
queries: [Query.limit(limit), Query.offset(variablesOffset)]
}),
projectSdk.vcs.listInstallations({
queries: [Query.limit(limit), Query.offset(offset)]
})
]);
const [variablesResult, installationsResult, addonsResult, addonPriceResult] =
await Promise.allSettled([
projectSdk.projectApi.listVariables({
queries: [Query.limit(limit), Query.offset(variablesOffset)]
}),
projectSdk.vcs.listInstallations({
queries: [Query.limit(limit), Query.offset(offset)]
}),
isCloud
? sdk
.forConsoleIn(params.region)
.projects.listAddons({ projectId: params.project })
.catch(() => null)
: Promise.resolve(null),
isCloud
? sdk
.forConsoleIn(params.region)
.projects.getAddonPrice({
projectId: params.project,
addon: Addon.Premiumgeodb
})
.catch(() => null)
: Promise.resolve(null)
]);

const variables =
variablesResult.status === 'fulfilled'
? variablesResult.value
: (() => {
// Read-only users can be blocked from write-adjacent settings APIs.
// Only silence those permission errors so genuine load failures still surface.
if (!isReadonlySettingsPermissionError(variablesResult.reason)) {
throw variablesResult.reason;
}
Expand All @@ -45,8 +61,6 @@ export const load: PageLoad = async ({ depends, url, params }) => {
installationsResult.status === 'fulfilled'
? installationsResult.value
: (() => {
// Read-only users can be blocked from write-adjacent settings APIs.
// Only silence those permission errors so genuine load failures still surface.
if (!isReadonlySettingsPermissionError(installationsResult.reason)) {
throw installationsResult.reason;
}
Expand All @@ -57,11 +71,16 @@ export const load: PageLoad = async ({ depends, url, params }) => {
};
})();

const addons = addonsResult.status === 'fulfilled' ? addonsResult.value : null;
const addonPrice = addonPriceResult.status === 'fulfilled' ? addonPriceResult.value : null;

return {
limit,
offset,
variablesOffset,
variables,
installations
installations,
addons,
addonPrice
};
};
Loading
Loading