Skip to content

feat: add Premium Geo DB addon to project settings#2981

Open
lohanidamodar wants to merge 6 commits intomainfrom
feat/project-premium-geo-db-addon
Open

feat: add Premium Geo DB addon to project settings#2981
lohanidamodar wants to merge 6 commits intomainfrom
feat/project-premium-geo-db-addon

Conversation

@lohanidamodar
Copy link
Copy Markdown
Member

Summary

Adds a Premium Geo DB section to the project settings page so users can enable and disable the premium geolocation addon per-project on cloud.

The section supports the full addon lifecycle, mirroring the BAA pattern at the organization level:

  • Upgrade prompt when the current plan does not support the addon
  • Enable flow with optional 3DS payment authentication
  • Pending state with cancel & retry option (if payment was interrupted)
  • Active state with disable action
  • Scheduled-for-removal state with re-enable action

Uses the new project-scoped SDK methods shipped with the cloud update: listAddons, createPremiumGeoDBAddon, and deleteAddon. Bumps the @appwrite.io/console SDK pin accordingly.

Test plan

  • Navigate to a cloud project's settings as an org owner on a plan that supports Premium Geo DB → section appears with Enable CTA
  • Click Enable → modal confirms and enables the addon (3DS where required); section transitions to Active
  • Click Disable → confirms removal at end of billing cycle; section transitions to Scheduled-for-removal
  • Click Keep Premium Geo DB while Scheduled-for-removal → returns to Active
  • On a plan that doesn't support the addon → shows Upgrade plan CTA / "not available" copy
  • On self-hosted mode → section is hidden

🤖 Generated with Claude Code

Adds a Premium Geo DB section to the project settings page so users
can enable and disable the premium geolocation addon per-project on
cloud. The section supports the full addon lifecycle:

- Upgrade prompt when the current plan does not support the addon
- Enable flow with optional 3DS payment authentication
- Pending state with cancel & retry option
- Active state with disable action
- Scheduled-for-removal state with re-enable action

Uses the new project-scoped SDK methods: listAddons, createPremiumGeoDBAddon,
and deleteAddon. Bumps the @appwrite.io/console SDK pin accordingly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 18, 2026

Greptile Summary

This PR introduces a Premium Geo DB addon section to project settings, mirroring the org-level BAA pattern — covering upgrade prompts, enable/disable flows, pending state with cancel-and-retry, and scheduled-for-removal re-enable. The enable modal correctly handles 3DS PaymentAuthentication responses and 409 conflicts; however, the open threads around the missing onMount 3DS return handler in premiumGeoDB.svelte and the silent dropping of PaymentAuthentication in handleReEnable remain unresolved and will leave users stranded in pending state after a 3DS challenge on first-enable redirect or re-enable respectively.

Confidence Score: 3/5

Not safe to merge until the two open 3DS-handling defects in premiumGeoDB.svelte are resolved.

The two unresolved prior-thread findings are P1 defects on the primary user path: (1) no onMount handler to call confirmAddonPayment after 3DS redirect leaves every first-enable via 3DS permanently stuck in pending, and (2) handleReEnable silently discards the PaymentAuthentication return value so re-enabling a scheduled-for-removal addon via 3DS fires a success toast while the addon stays pending. Both affect the core enable flow on plans that require payment authentication.

src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte requires the most attention — both open defects live there.

Important Files Changed

Filename Overview
src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte Main component for Premium Geo DB addon; missing onMount 3DS return handler and handleReEnable silently drops PaymentAuthentication response (flagged in prior threads)
src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte Enable modal correctly handles 3DS PaymentAuthentication response with clientSecret check and confirmPayment call; 409 conflict also handled as success
src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte Straightforward disable modal; calls deleteAddon and invalidates ADDONS/PROJECT dependencies correctly
src/routes/(console)/project-[region]-[project]/settings/+page.ts Loads addons and addonPrice in parallel using cloud-gated SDK calls; both gracefully catch errors and resolve null on self-hosted
src/routes/(console)/project-[region]-[project]/settings/+page.svelte Adds PremiumGeoDB component under isCloud guard; existing onMount does not handle type=confirm-addon for 3DS return (flagged in prior thread)
src/routes/(console)/organization-[organization]/billing/planSummary.svelte Removes hardcoded billingAddonNames map and adds per-project addon rows to billing breakdown; addon.name fallback concern flagged in prior thread
package.json Bumps @appwrite.io/console SDK pin from f063676 to 7df3842 to include listAddons, createPremiumGeoDBAddon, and deleteAddon project-scoped methods
bun.lock Lock file updated to reflect new SDK pin; no other dependency changes

Reviews (6): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment on lines +64 to +83
async function handleReEnable() {
reEnabling = true;
try {
await sdk.forConsoleIn(page.params.region).projects.createPremiumGeoDBAddon({
projectId: page.params.project
});
await Promise.all([invalidate(Dependencies.ADDONS), invalidate(Dependencies.PROJECT)]);
addNotification({
message: 'Premium Geo DB addon has been re-enabled',
type: 'success'
});
} catch (e) {
addNotification({
message: e.message,
type: 'error'
});
} finally {
reEnabling = false;
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 handleReEnable silently drops 3DS response

createPremiumGeoDBAddon can return either a Models.Addon (immediate success) or a Models.PaymentAuthentication (3DS required). handleReEnable discards the return value entirely, so if re-enabling requires 3DS the payment challenge is never initiated — the notification fires as "re-enabled" while the addon actually sits in pending state waiting for a payment that will never complete.

The enable modal handles this correctly via the 'clientSecret' in result check and subsequent confirmPayment call. handleReEnable should mirror that same pattern, exactly as BAA.svelte's handleReEnable does.

lohanidamodar and others added 4 commits April 19, 2026 11:13
Mirrors the BAA addon UX by fetching the addon price via
organizations.getAddonPrice(Addon.Premiumgeodb) from the settings
page loader, passing it through to the Premium Geo DB card and
enable modal, and rendering the monthly/prorated breakdown with
formatCurrency alongside the Enable CTA.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…name

- Each project row in the organization billing breakdown now iterates
  its resources for addon_* entries (amount > 0) and renders them as
  child rows (e.g. Premium Geo DB under the project it was enabled on).
  The backend already filters project-scoped addons out of the
  team-level resources response, so the org "Addons" section shows only
  org-scoped addons (BAA, premiumGeoDBOrg) while project-scoped ones
  surface where they belong.
- Org-level addon labels now read addon.name from the UsageResource
  payload that the getAggregation endpoint populates from billingAddons
  config. Dropped the hard-coded billingAddonNames map so new addons
  surface with their proper name without a console update.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment on lines +268 to +269
: addon.name ||
`${addon.resourceId} overage (${formatNum(addon.value)})`,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 BAA label regression if API omits name

The hardcoded billingAddonNames map (addon_baa → 'HIPAA BAA') has been removed in favour of addon.name. If the billing-aggregation API response doesn't populate name on existing BAA resources, BAA will display as addon_baa overage (1) in the plan summary for current BAA subscribers. Make sure the cloud API (and the new SDK pin) actually includes name on billing resource objects, or keep a fallback map alongside the API-provided name as a safety net.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant