diff --git a/package.json b/package.json
index 15cb88fa7f..50b4029dce 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@9b32107",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7a147b9",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@865e2fc",
"@appwrite.io/pink-legacy": "^1.0.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f7492f49f0..ce01083e0f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,8 +12,8 @@ importers:
specifier: ^1.1.24
version: 1.1.24(svelte@5.25.3)(zod@3.24.3)
'@appwrite.io/console':
- specifier: https://pkg.vc/-/@appwrite/@appwrite.io/console@9b32107
- version: https://pkg.vc/-/@appwrite/@appwrite.io/console@9b32107
+ specifier: https://pkg.vc/-/@appwrite/@appwrite.io/console@7a147b9
+ version: https://pkg.vc/-/@appwrite/@appwrite.io/console@7a147b9
'@appwrite.io/pink-icons':
specifier: 0.25.0
version: 0.25.0
@@ -272,8 +272,8 @@ packages:
'@analytics/type-utils@0.6.2':
resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==}
- '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@9b32107':
- resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/console@9b32107}
+ '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@7a147b9':
+ resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/console@7a147b9}
version: 1.10.0
'@appwrite.io/pink-icons-svelte@2.0.0-RC.1':
@@ -3823,7 +3823,7 @@ snapshots:
'@analytics/type-utils@0.6.2': {}
- '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@9b32107': {}
+ '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@7a147b9': {}
'@appwrite.io/pink-icons-svelte@2.0.0-RC.1(svelte@5.25.3)':
dependencies:
diff --git a/src/lib/commandCenter/searchers/organizations.ts b/src/lib/commandCenter/searchers/organizations.ts
index c24f38799e..9df8003a17 100644
--- a/src/lib/commandCenter/searchers/organizations.ts
+++ b/src/lib/commandCenter/searchers/organizations.ts
@@ -1,16 +1,10 @@
+import { resolve } from '$app/paths';
import { goto } from '$app/navigation';
-import { base } from '$app/paths';
-import { sdk } from '$lib/stores/sdk';
import type { Searcher } from '../commands';
-import { isCloud } from '$lib/system';
-import { Platform, Query } from '@appwrite.io/console';
+import { getTeamOrOrganizationList } from '$lib/stores/organization';
export const orgSearcher = (async (query: string) => {
- const { teams } = !isCloud
- ? await sdk.forConsole.teams.list()
- : await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ]);
+ const { teams } = await getTeamOrOrganizationList();
return teams
.filter((organization) => organization.name.toLowerCase().includes(query.toLowerCase()))
@@ -18,7 +12,11 @@ export const orgSearcher = (async (query: string) => {
return {
label: organization.name,
callback: () => {
- goto(`${base}/organization-${organization.$id}`);
+ goto(
+ resolve('/(console)/organization-[organization]', {
+ organization: organization.$id
+ })
+ );
},
group: 'organizations'
} as const;
diff --git a/src/lib/components/archiveProject.svelte b/src/lib/components/archiveProject.svelte
index 8a9797ca09..a8b7362842 100644
--- a/src/lib/components/archiveProject.svelte
+++ b/src/lib/components/archiveProject.svelte
@@ -37,14 +37,12 @@
import { isSmallViewport } from '$lib/stores/viewport';
import { isCloud } from '$lib/system';
import { regions as regionsStore } from '$lib/stores/organization';
- import type { Organization } from '$lib/stores/organization';
- import type { Plan } from '$lib/sdk/billing';
// props
interface Props {
+ currentPlan: Models.BillingPlan;
+ organization: Models.Organization;
projectsToArchive: Models.Project[];
- organization: Organization;
- currentPlan: Plan;
}
let { projectsToArchive, organization, currentPlan }: Props = $props();
diff --git a/src/lib/components/billing/alerts/limitReached.svelte b/src/lib/components/billing/alerts/limitReached.svelte
index 4885db75e1..12605cded4 100644
--- a/src/lib/components/billing/alerts/limitReached.svelte
+++ b/src/lib/components/billing/alerts/limitReached.svelte
@@ -5,16 +5,21 @@
import { BillingPlan } from '$lib/constants';
import { Button } from '$lib/elements/forms';
import { HeaderAlert } from '$lib/layout';
- import { hideBillingHeaderRoutes, readOnly, tierToPlan, upgradeURL } from '$lib/stores/billing';
+ import {
+ hideBillingHeaderRoutes,
+ readOnly,
+ billingIdToPlan,
+ upgradeURL
+ } from '$lib/stores/billing';
import { organization } from '$lib/stores/organization';
{#if $organization?.$id && $organization?.billingPlan === BillingPlan.FREE && $readOnly && !hideBillingHeaderRoutes.includes(page.url.pathname)}
+ title={`${$organization.name} usage has reached the ${billingIdToPlan($organization.billingPlan).name} plan limit`}>
- Usage for the {$organization.name} organization has reached the limits of the {tierToPlan(
+ Usage for the {$organization.name} organization has reached the limits of the {billingIdToPlan(
$organization.billingPlan
).name}
plan. Consider upgrading to increase your resource usage.
diff --git a/src/lib/components/billing/alerts/paymentMandate.svelte b/src/lib/components/billing/alerts/paymentMandate.svelte
index 08d9207d73..0126f2f9a0 100644
--- a/src/lib/components/billing/alerts/paymentMandate.svelte
+++ b/src/lib/components/billing/alerts/paymentMandate.svelte
@@ -8,10 +8,9 @@
import { confirmSetup } from '$lib/stores/stripe';
async function verifyPaymentMethod() {
- const method = await sdk.forConsole.billing.setupPaymentMandate(
- $organization.$id,
- $paymentMissingMandate.$id
- );
+ const method = await sdk.forConsole.account.updatePaymentMethodMandateOptions({
+ paymentMethodId: $paymentMissingMandate.$id
+ });
await confirmSetup(method.clientSecret, method.providerMethodId);
}
diff --git a/src/lib/components/billing/alerts/selectProjectCloud.svelte b/src/lib/components/billing/alerts/selectProjectCloud.svelte
index 510334aa2e..192cf92db9 100644
--- a/src/lib/components/billing/alerts/selectProjectCloud.svelte
+++ b/src/lib/components/billing/alerts/selectProjectCloud.svelte
@@ -31,10 +31,10 @@
async function updateSelected() {
try {
- await sdk.forConsole.billing.updateSelectedProjects(
- projects[0].teamId,
- selectedProjects
- );
+ await sdk.forConsole.organizations.updateProjects({
+ organizationId: projects[0].teamId,
+ projects: selectedProjects
+ });
showSelectProject = false;
invalidate(Dependencies.ORGANIZATION);
diff --git a/src/lib/components/billing/couponInput.svelte b/src/lib/components/billing/couponInput.svelte
index 85e73411c0..fc33df37df 100644
--- a/src/lib/components/billing/couponInput.svelte
+++ b/src/lib/components/billing/couponInput.svelte
@@ -1,16 +1,16 @@
-
+ {#if children}
+ {@render children()}
+ {:else}
Upgrade to add {service}
- Upgrade to a {tierToPlan(BillingPlan.PRO).name} plan to add {service} to your organization
+ Upgrade to a {proPlanName} plan to add {service} to your organization
-
+ {/if}
diff --git a/src/lib/components/billing/estimatedTotalBox.svelte b/src/lib/components/billing/estimatedTotalBox.svelte
index dd78788903..d5bf80dc7d 100644
--- a/src/lib/components/billing/estimatedTotalBox.svelte
+++ b/src/lib/components/billing/estimatedTotalBox.svelte
@@ -1,36 +1,37 @@
- {#each visibleTiers as tier}
+ {#each uniquePlans as plan}
(selectedTab = tier)}>
- {tierToPlan(tier).name}
+ active={selectedTab === plan.$id}
+ on:click={() => (selectedTab = plan.$id)}>
+ {plan.name}
{/each}
- {plan.name} plan
- {#if selectedTab === BillingPlan.FREE}
- {#if downgrade}
-
-
-
-
- Limited to {plan.databases} Database, {plan.buckets} Buckets, {plan.functions}
- Functions per project
-
-
-
-
- Limited to 1 organization member
-
-
-
-
- {plan.bandwidth}GB bandwidth
-
-
-
-
-
- {plan.storage}GB storage
-
-
-
-
-
- {formatNum(plan.executions)} executions
-
-
-
- {:else}
-
-
- Limited to {plan.databases} Database, {plan.buckets} Buckets, {plan.functions}
- Functions per project
-
- Limited to 1 organization member
-
- Limited to {plan.bandwidth}GB bandwidth
-
-
- Limited to {plan.storage}GB storage
-
-
- Limited to {formatNum(plan.executions)} executions
-
-
- {/if}
- {:else if selectedTab === BillingPlan.PRO}
- Everything in the Free plan, plus:
-
- Unlimited databases, buckets, functions
- Unlimited seats
- {plan.bandwidth}GB bandwidth
- {plan.storage}GB storage
- {formatNum(plan.executions)} executions
- Email support
+ {currentPlan.name} plan
+
+ {@render appwritePlanView()}
+
+
+
+{#snippet appwritePlanView()}
+ {#if planHasGroup(selectedTab, BillingPlanGroup.Starter)}
+ {#if downgrade}
+
+
+
+
+ Limited to {currentPlan.databases}
+ {pluralize(currentPlan.databases, 'Database')}, {currentPlan.buckets}
+ {pluralize(currentPlan.buckets, 'Bucket')}, {currentPlan.functions}
+ {pluralize(currentPlan.functions, 'Function')} per project
+
+
+
+
+ Limited to 1 organization member
+
+
+
+
+ {currentPlan.bandwidth}GB bandwidth
+
+
+
+
+
+ {currentPlan.storage}GB storage
+
+
+
+
+
+ {formatNum(currentPlan.executions)} executions
+
+
- {:else if selectedTab === BillingPlan.SCALE}
- Everything in the Pro plan, plus:
+ {:else}
- Unlimited seats
- Organization roles
- SOC-2, HIPAA compliance
- SSO Coming soon
- Priority support
+
+ Limited to {currentPlan.databases}
+ {pluralize(currentPlan.databases, 'Database')}, {currentPlan.buckets}
+ {pluralize(currentPlan.buckets, 'Bucket')}, {currentPlan.functions}
+ {pluralize(currentPlan.functions, 'Function')} per project
+
+ Limited to 1 organization member
+
+ Limited to {currentPlan.bandwidth}GB bandwidth
+
+
+ Limited to {currentPlan.storage}GB storage
+
+
+ Limited to {formatNum(currentPlan.executions)} executions
+
{/if}
-
-
+ {:else if planHasGroup(selectedTab, BillingPlanGroup.Pro)}
+ Everything in the Free plan, plus:
+
+ Unlimited databases, buckets, functions
+ Unlimited seats
+ {currentPlan.bandwidth}GB bandwidth
+ {currentPlan.storage}GB storage
+ {formatNum(currentPlan.executions)} executions
+ Email support
+
+ {:else if planHasGroup(selectedTab, BillingPlanGroup.Scale)}
+ Everything in the Pro plan, plus:
+
+ Unlimited seats
+ Organization roles
+ SOC-2, HIPAA compliance
+ SSO Coming soon
+ Priority support
+
+ {/if}
+{/snippet}
diff --git a/src/lib/components/billing/planExcess.svelte b/src/lib/components/billing/planExcess.svelte
deleted file mode 100644
index 7bdf28e3f8..0000000000
--- a/src/lib/components/billing/planExcess.svelte
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-{#if showExcess}
-
- You will retain access to {tierToPlan($organization.billingPlan).name} plan features until your
- billing period ends. After that,
- {#if excess?.members > 0}
- all team members except the owner will be removed,
- {:else}
- your organization will be limited to Free plan resources,
- {/if} and service disruptions may occur if usage exceeds Free plan limits.
-
-
-
-
- Resource
- Free limit
-
- Excess usage
- Metrics are estimates updated every 24 hours
-
-
-
- {#if excess?.members}
-
- Organization members
- {getServiceLimit('members', tier)} members
-
-
-
- {excess?.members} members
-
-
-
- {/if}
- {#if excess?.storage}
-
- Storage
- {plan.storage} GB
-
-
-
- {humanFileSize(excess?.storage).value}
- {humanFileSize(excess?.storage).unit}
-
-
-
- {/if}
- {#if excess?.executions}
-
- Function executions
-
- {abbreviateNumber(plan.executions)} executions
-
-
-
-
-
- {formatNum(excess?.executions)} executions
-
-
-
-
- {/if}
- {#if excess?.users}
-
- Users
-
- {abbreviateNumber(plan.users)} users
-
-
-
-
-
- {formatNum(excess?.users)} users
-
-
-
-
- {/if}
-
-{/if}
diff --git a/src/lib/components/billing/planSelection.svelte b/src/lib/components/billing/planSelection.svelte
index 6499a47c0b..6d8d4a562b 100644
--- a/src/lib/components/billing/planSelection.svelte
+++ b/src/lib/components/billing/planSelection.svelte
@@ -4,21 +4,21 @@
import { currentPlan, organization } from '$lib/stores/organization';
import { Badge, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte';
import { LabelCard } from '..';
- import type { Plan } from '$lib/sdk/billing';
import { page } from '$app/state';
+ import type { Models } from '@appwrite.io/console';
export let billingPlan: BillingPlan;
export let isNewOrg = false;
export let selfService = true;
export let anyOrgFree = false;
- $: plans = Object.values(page.data.plans.plans) as Plan[];
+ $: plans = Object.values(page.data.plans.plans) as Models.BillingPlan[];
$: currentPlanInList = plans.some((plan) => plan.$id === $currentPlan?.$id);
// experiment to remove scale plan temporarily
$: plansWithoutScale = plans.filter((plan) => plan.$id != BillingPlan.SCALE);
- function shouldShowTooltip(plan: Plan) {
+ function shouldShowTooltip(plan: Models.BillingPlan) {
if (plan.$id !== BillingPlan.FREE) return true;
else return !anyOrgFree;
}
diff --git a/src/lib/components/billing/selectPaymentMethod.svelte b/src/lib/components/billing/selectPaymentMethod.svelte
index c80aacacfe..9682b99953 100644
--- a/src/lib/components/billing/selectPaymentMethod.svelte
+++ b/src/lib/components/billing/selectPaymentMethod.svelte
@@ -1,6 +1,5 @@
diff --git a/src/lib/components/emptyCardImageCloud.svelte b/src/lib/components/emptyCardImageCloud.svelte
index 0f4c234504..870edc4889 100644
--- a/src/lib/components/emptyCardImageCloud.svelte
+++ b/src/lib/components/emptyCardImageCloud.svelte
@@ -1,8 +1,8 @@
@@ -24,7 +26,7 @@
-
+
diff --git a/src/lib/components/organizationUsageLimits.svelte b/src/lib/components/organizationUsageLimits.svelte
index dac1cbb3d6..9705442c47 100644
--- a/src/lib/components/organizationUsageLimits.svelte
+++ b/src/lib/components/organizationUsageLimits.svelte
@@ -11,15 +11,15 @@
import { Alert } from '@appwrite.io/pink-svelte';
import { addNotification } from '$lib/stores/notifications';
import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date';
- import { organization, type Organization } from '$lib/stores/organization';
+ import { organization } from '$lib/stores/organization';
import type { Models } from '@appwrite.io/console';
// Props
type Props = {
- organization: Organization;
+ storageUsage?: number;
projects?: Models.Project[];
members?: Models.Membership[];
- storageUsage?: number;
+ organization: Models.Organization;
};
const { projects = [], members = [], storageUsage = 0 }: Props = $props();
diff --git a/src/lib/components/support.svelte b/src/lib/components/support.svelte
index d05d2639c3..a3d98cccbd 100644
--- a/src/lib/components/support.svelte
+++ b/src/lib/components/support.svelte
@@ -8,10 +8,11 @@
import { plansInfo } from '$lib/stores/billing';
import { Card } from '$lib/components/index';
import { app } from '$lib/stores/app';
- import { currentPlan, type Organization, organizationList } from '$lib/stores/organization';
+ import { currentPlan, organizationList } from '$lib/stores/organization';
import { isCloud } from '$lib/system';
import { Typography } from '@appwrite.io/pink-svelte';
import { base } from '$app/paths';
+ import type { Models } from '@appwrite.io/console';
export let show = false;
@@ -20,12 +21,12 @@
$: hasPremiumSupport = $currentPlan?.premiumSupport ?? allOrgsHavePremiumSupport ?? false;
$: allOrgsHavePremiumSupport = $organizationList.teams.every(
- (team) => $plansInfo.get((team as Organization).billingPlan)?.premiumSupport
+ (team) => $plansInfo.get((team as Models.Organization).billingPlan)?.premiumSupport
);
// there can only be one free organization
$: freeOrganization = $organizationList.teams.find(
- (team) => !$plansInfo.get((team as Organization).billingPlan)?.premiumSupport
+ (team) => !$plansInfo.get((team as Models.Organization).billingPlan)?.premiumSupport
);
$: upgradeURL = `${base}/organization-${freeOrganization?.$id}/change-plan`;
diff --git a/src/lib/flags.ts b/src/lib/flags.ts
index dfbedecd9e..288091e791 100644
--- a/src/lib/flags.ts
+++ b/src/lib/flags.ts
@@ -1,6 +1,6 @@
import { env } from '$env/dynamic/public';
import type { Account } from './stores/user';
-import type { Organization } from './stores/organization';
+import type { Models } from '@appwrite.io/console';
// Parse feature flags from env as a string array (exact match only)
const flagsRaw = (env.PUBLIC_CONSOLE_FEATURE_FLAGS ?? '').split(',');
@@ -8,7 +8,7 @@ const flagsRaw = (env.PUBLIC_CONSOLE_FEATURE_FLAGS ?? '').split(',');
// @ts-expect-error: unused method!
function isFlagEnabled(name: string) {
// loose generic to allow safe access while retaining type safety
- return (data: T) => {
+ return (data: T) => {
const { account, organization } = data;
return !!(
diff --git a/src/lib/layout/containerButton.svelte b/src/lib/layout/containerButton.svelte
index 53cfc35bf1..de3f0024cf 100644
--- a/src/lib/layout/containerButton.svelte
+++ b/src/lib/layout/containerButton.svelte
@@ -1,7 +1,7 @@
diff --git a/src/routes/(console)/account/payments/deleteAddressModal.svelte b/src/routes/(console)/account/payments/deleteAddressModal.svelte
index 059beab3cb..9f267daabb 100644
--- a/src/routes/(console)/account/payments/deleteAddressModal.svelte
+++ b/src/routes/(console)/account/payments/deleteAddressModal.svelte
@@ -4,20 +4,23 @@
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import Confirm from '$lib/components/confirm.svelte';
import { Dependencies } from '$lib/constants';
- import type { Address } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
- import type { Organization } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import { Layout, Link } from '@appwrite.io/pink-svelte';
+ import type { Models } from '@appwrite.io/console';
export let showDelete = false;
- export let selectedAddress: Address;
- export let linkedOrgs: Organization[] = [];
+ export let linkedOrgs: Array = [];
+ export let selectedAddress: Models.BillingAddress;
+
let error: string = null;
async function handleDelete() {
try {
- await sdk.forConsole.billing.deleteAddress(selectedAddress.$id);
+ await sdk.forConsole.account.deleteBillingAddress({
+ billingAddressId: selectedAddress.$id
+ });
+
await invalidate(Dependencies.PAYMENT_METHODS);
showDelete = false;
addNotification({
diff --git a/src/routes/(console)/account/payments/deletePaymentModal.svelte b/src/routes/(console)/account/payments/deletePaymentModal.svelte
index 50406a32f5..613db91617 100644
--- a/src/routes/(console)/account/payments/deletePaymentModal.svelte
+++ b/src/routes/(console)/account/payments/deletePaymentModal.svelte
@@ -5,19 +5,21 @@
import Confirm from '$lib/components/confirm.svelte';
import { Dependencies } from '$lib/constants';
import { addNotification } from '$lib/stores/notifications';
- import type { Organization } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import { Layout, Link, Typography } from '@appwrite.io/pink-svelte';
+ import type { Models } from '@appwrite.io/console';
- export let linkedOrgs: Organization[] = [];
- export let showDelete = false;
export let method: string;
+ export let showDelete = false;
+ export let linkedOrgs: Array = [];
let error: string;
async function handleDelete() {
try {
- await sdk.forConsole.billing.deletePaymentMethod(method);
+ await sdk.forConsole.account.deletePaymentMethod({
+ paymentMethodId: method
+ });
await invalidate(Dependencies.PAYMENT_METHODS);
showDelete = false;
addNotification({
diff --git a/src/routes/(console)/account/payments/editAddressModal.svelte b/src/routes/(console)/account/payments/editAddressModal.svelte
index 59b709bdd5..c77d0224a6 100644
--- a/src/routes/(console)/account/payments/editAddressModal.svelte
+++ b/src/routes/(console)/account/payments/editAddressModal.svelte
@@ -4,16 +4,15 @@
import { Modal } from '$lib/components';
import { Dependencies } from '$lib/constants';
import { Button, InputSelect, InputText } from '$lib/elements/forms';
- import type { Address } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { onMount } from 'svelte';
import type { Models } from '@appwrite.io/console';
export let show = false;
- export let selectedAddress: Address;
export let locale: Models.Locale;
export let countryList: Models.CountryList;
+ export let selectedAddress: Models.BillingAddress;
let error: string = null;
let options = [
@@ -34,15 +33,17 @@
async function handleSubmit() {
try {
- await sdk.forConsole.billing.updateAddress(
- selectedAddress.$id,
- selectedAddress.country,
- selectedAddress.streetAddress,
- selectedAddress.city,
- selectedAddress.state,
- selectedAddress.postalCode ? selectedAddress.postalCode : undefined,
- selectedAddress.addressLine2 ? selectedAddress.addressLine2 : undefined
- );
+ await sdk.forConsole.account.updateBillingAddress({
+ billingAddressId: selectedAddress.$id,
+ country: selectedAddress.country,
+ streetAddress: selectedAddress.streetAddress,
+ city: selectedAddress.city,
+ state: selectedAddress.state,
+ postalCode: selectedAddress.postalCode ? selectedAddress.postalCode : undefined,
+ addressLine2: selectedAddress.addressLine2
+ ? selectedAddress.addressLine2
+ : undefined
+ });
await invalidate(Dependencies.ADDRESS);
show = false;
addNotification({
diff --git a/src/routes/(console)/account/payments/editPaymentModal.svelte b/src/routes/(console)/account/payments/editPaymentModal.svelte
index 7850cdea9a..fd63c1e1d5 100644
--- a/src/routes/(console)/account/payments/editPaymentModal.svelte
+++ b/src/routes/(console)/account/payments/editPaymentModal.svelte
@@ -5,25 +5,28 @@
import { Dependencies } from '$lib/constants';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
- import type { PaymentMethodData } from '$lib/sdk/billing';
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { Alert } from '@appwrite.io/pink-svelte';
+ import type { Models } from '@appwrite.io/console';
export let show = false;
- export let selectedPaymentMethod: PaymentMethodData;
export let isLinked = false;
+ export let selectedPaymentMethod: Models.PaymentMethod;
+
const currentYear = new Date().getFullYear();
+
let error: string;
let month: string;
let year: number;
async function handleSubmit() {
try {
- await sdk.forConsole.billing.updatePaymentMethod(
- selectedPaymentMethod.$id,
- month,
- year?.toString()
- );
+ await sdk.forConsole.account.updatePaymentMethod({
+ paymentMethodId: selectedPaymentMethod.$id,
+ expiryMonth: parseInt(month),
+ expiryYear: year
+ });
+
trackEvent(Submit.PaymentMethodUpdate);
invalidate(Dependencies.PAYMENT_METHODS);
show = false;
diff --git a/src/routes/(console)/account/payments/paymentMethods.svelte b/src/routes/(console)/account/payments/paymentMethods.svelte
index 8e53a8d3da..05f866bfb6 100644
--- a/src/routes/(console)/account/payments/paymentMethods.svelte
+++ b/src/routes/(console)/account/payments/paymentMethods.svelte
@@ -2,8 +2,7 @@
import { CardGrid, CreditCardInfo, Empty } from '$lib/components';
import { Button } from '$lib/elements/forms';
import { paymentMethods } from '$lib/stores/billing';
- import type { PaymentMethodData } from '$lib/sdk/billing';
- import { organizationList, type Organization } from '$lib/stores/organization';
+ import { organizationList } from '$lib/stores/organization';
import { base } from '$app/paths';
import EditPaymentModal from './editPaymentModal.svelte';
import DeletePaymentModal from './deletePaymentModal.svelte';
@@ -26,22 +25,21 @@
Tag,
Typography
} from '@appwrite.io/pink-svelte';
+ import type { Models } from '@appwrite.io/console';
export let showPayment = false;
let showDropdown = [];
- let selectedMethod: PaymentMethodData;
- let selectedLinkedOrgs: Organization[] = [];
+ let selectedMethod: Models.PaymentMethod;
+ let selectedLinkedOrgs: Array = [];
let showDelete = false;
let showEdit = false;
let isLinked = false;
- $: orgList = $organizationList.teams as unknown as Organization[];
+ $: orgList = $organizationList.teams as unknown as Array;
- $: filteredMethods = $paymentMethods?.paymentMethods.filter(
- (method: PaymentMethodData) => !!method?.last4
- );
+ $: filteredMethods = $paymentMethods?.paymentMethods.filter((method) => !!method?.last4);
- const isMethodLinkedToOrg = (methodId: string, org: Organization) =>
+ const isMethodLinkedToOrg = (methodId: string, org: Models.Organization) =>
methodId === org.paymentMethodId || methodId === org.backupPaymentMethodId;
$: linkedMethodIds = new Set(
diff --git a/src/routes/(console)/apply-credit/+page.svelte b/src/routes/(console)/apply-credit/+page.svelte
index db9dbc0387..a033dbc44a 100644
--- a/src/routes/(console)/apply-credit/+page.svelte
+++ b/src/routes/(console)/apply-credit/+page.svelte
@@ -8,19 +8,14 @@
import { Button, Form, InputSelect, InputTags, InputText } from '$lib/elements/forms';
import { toLocaleDate } from '$lib/helpers/date';
import { Wizard } from '$lib/layout';
- import type { PaymentList, Plan } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
- import {
- organizationList,
- type Organization,
- type OrganizationError
- } from '$lib/stores/organization';
+ import { type OrganizationError, organizationList } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import { confirmPayment } from '$lib/stores/stripe.js';
- import { ID } from '@appwrite.io/console';
+ import { BillingPlanGroup, ID, type Models } from '@appwrite.io/console';
import { onMount } from 'svelte';
import { writable } from 'svelte/store';
- import { isOrganization, plansInfo, type Tier } from '$lib/stores/billing';
+ import { getBasePlanFromGroup, isOrganization, plansInfo } from '$lib/stores/billing';
import { Fieldset, Icon, Layout, Tooltip } from '@appwrite.io/pink-svelte';
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
import EstimatedTotalBox from '$lib/components/billing/estimatedTotalBox.svelte';
@@ -48,7 +43,7 @@
let formComponent: Form;
let couponForm: Form;
let isSubmitting = writable(false);
- let methods: PaymentList;
+ let methods: Models.PaymentMethodList;
let paymentMethodId: string;
let collaborators: string[];
let taxId: string;
@@ -68,9 +63,11 @@
let coupon: string;
let couponData = data?.couponData;
let campaign = data?.campaign;
- let billingPlan: Tier = BillingPlan.PRO;
let tempOrgId = null;
- let currentPlan: Plan;
+
+ let billingPlan = getBasePlanFromGroup(BillingPlanGroup.Pro).$id;
+
+ let currentPlan: Models.BillingPlan;
$: onlyNewOrgs = campaign?.onlyNewOrgs || couponData?.onlyNewOrgs;
@@ -103,7 +100,10 @@
const organizationId = page.url.searchParams.get('id');
collaborators = page.url.searchParams.get('invites').split(',');
- await sdk.forConsole.billing.validateOrganization(organizationId, collaborators);
+ await sdk.forConsole.organizations.validatePayment({
+ organizationId,
+ invites: collaborators
+ });
}
}
@@ -113,7 +113,7 @@
});
async function loadPaymentMethods() {
- const methodList = await sdk.forConsole.billing.listPaymentMethods();
+ const methodList = await sdk.forConsole.account.listPaymentMethods();
const filteredMethods = methodList.paymentMethods.filter((method) => !!method?.last4);
methods = { paymentMethods: filteredMethods, total: filteredMethods.length };
paymentMethodId =
@@ -126,7 +126,7 @@
if (couponForm && !couponForm.checkValidity()) return;
isSubmitting.set(true);
try {
- let org: Organization | OrganizationError;
+ let org: Models.Organization | OrganizationError;
// Create new org
if (selectedOrgId === newOrgId) {
org = await sdk.forConsole.billing.createOrganization(
@@ -156,7 +156,10 @@
// Existing pro org, apply credits
else {
org = selectedOrg;
- await sdk.forConsole.billing.addCredit(org.$id, couponData.code);
+ await sdk.forConsole.organizations.addCredit({
+ organizationId: org.$id,
+ couponId: couponData.code
+ });
}
if (!isOrganization(org) && org.status === 402) {
@@ -176,7 +179,11 @@
paymentMethodId,
`${base}/apply-credit?${params}`
);
- org = await sdk.forConsole.billing.validateOrganization(org.teamId, collaborators);
+
+ org = await sdk.forConsole.organizations.validatePayment({
+ organizationId: org.teamId,
+ invites: collaborators
+ });
}
if (isOrganization(org)) {
@@ -205,8 +212,10 @@
async function addCoupon() {
try {
- const response = await sdk.forConsole.billing.getCouponAccount(coupon);
- couponData = response;
+ couponData = await sdk.forConsole.console.getCoupon({
+ couponId: coupon
+ });
+
coupon = null;
addNotification({
type: 'success',
@@ -222,21 +231,21 @@
$: selectedOrg = $organizationList?.teams?.find(
(team) => team.$id === selectedOrgId
- ) as Organization;
+ ) as Models.Organization;
- function getBillingPlan(): Tier | undefined {
+ function getBillingPlan(): string | undefined {
const campaignPlan =
campaign?.plan && $plansInfo.get(campaign.plan) ? $plansInfo.get(campaign.plan) : null;
const newPlan = $plansInfo.get(billingPlan);
- // if campaign has a plan and it's higher than the selected new plan
+ // if campaign has a plan, and it's higher than the selected new plan
if (campaignPlan?.order > newPlan?.order) {
- return campaignPlan.$id as Tier;
+ return campaignPlan.$id;
}
// if current plan's order is higher than the selected new plan
if (currentPlan?.order > newPlan?.order) {
- return currentPlan.$id as Tier;
+ return currentPlan.$id;
}
return billingPlan;
@@ -250,7 +259,9 @@
$: if (!isNewOrg) {
(async () => {
- currentPlan = await sdk.forConsole.billing.getOrganizationPlan(selectedOrgId);
+ currentPlan = await sdk.forConsole.organizations.getPlan({
+ organizationId: selectedOrgId
+ });
})();
loadPaymentMethods();
}
diff --git a/src/routes/(console)/apply-credit/+page.ts b/src/routes/(console)/apply-credit/+page.ts
index 362a3adff7..998895e60c 100644
--- a/src/routes/(console)/apply-credit/+page.ts
+++ b/src/routes/(console)/apply-credit/+page.ts
@@ -1,38 +1,41 @@
-import { base } from '$app/paths';
-import type { Coupon } from '$lib/sdk/billing.js';
-import type { Campaign } from '$lib/stores/campaigns.js';
+import { resolve } from '$app/paths';
import { sdk } from '$lib/stores/sdk.js';
import { redirect } from '@sveltejs/kit';
+import type { Models } from '@appwrite.io/console';
export const load = async ({ url }) => {
// Has promo code
if (url.searchParams.has('code')) {
- let couponData: Coupon;
- let campaign: Campaign;
+ let couponData: Models.Coupon;
+ let campaign: Models.Campaign;
const code = url.searchParams.get('code');
try {
- couponData = await sdk.forConsole.billing.getCouponAccount(code);
+ couponData = await sdk.forConsole.console.getCoupon({
+ couponId: code
+ });
if (couponData.campaign) {
- campaign = await sdk.forConsole.billing.getCampaign(couponData.campaign);
+ campaign = await sdk.forConsole.console.getCampaign({
+ campaignId: couponData.campaign
+ });
}
return { couponData, campaign };
} catch (e) {
- redirect(303, base);
+ redirect(303, resolve('/'));
}
}
// Has campaign
else if (url.searchParams.has('campaign')) {
const campaignId = url.searchParams.get('campaign');
- let campaign: Campaign;
+ let campaign: Models.Campaign;
try {
- campaign = await sdk.forConsole.billing.getCampaign(campaignId);
+ campaign = await sdk.forConsole.console.getCampaign({ campaignId });
return { campaign };
} catch (e) {
- redirect(303, base);
+ redirect(303, resolve('/'));
}
}
// No campaign or promo code
else {
- redirect(303, base);
+ redirect(303, resolve('/'));
}
};
diff --git a/src/routes/(console)/create-organization/+page.svelte b/src/routes/(console)/create-organization/+page.svelte
index 13d296facd..565b2a7ac7 100644
--- a/src/routes/(console)/create-organization/+page.svelte
+++ b/src/routes/(console)/create-organization/+page.svelte
@@ -8,13 +8,12 @@
import { BillingPlan, Dependencies } from '$lib/constants';
import { Button, Form, InputTags, InputText } from '$lib/elements/forms';
import { Wizard } from '$lib/layout';
- import type { Coupon } from '$lib/sdk/billing';
- import { isOrganization, tierToPlan } from '$lib/stores/billing';
+ import { isOrganization, billingIdToPlan } from '$lib/stores/billing';
import { addNotification } from '$lib/stores/notifications';
- import type { OrganizationError, Organization } from '$lib/stores/organization';
+ import type { OrganizationError } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import { confirmPayment } from '$lib/stores/stripe';
- import { ID } from '@appwrite.io/console';
+ import { ID, type Models } from '@appwrite.io/console';
import { IconPlus } from '@appwrite.io/pink-icons-svelte';
import { Divider, Fieldset, Icon, Layout, Link, Typography } from '@appwrite.io/pink-svelte';
import { writable } from 'svelte/store';
@@ -27,7 +26,7 @@
let showExitModal = $state(false);
let previousPage: string = $state(resolve('/(console)'));
let selectedPlan: BillingPlan = $state(data.plan as BillingPlan);
- let selectedCoupon: Partial | null = $state(data.coupon);
+ let selectedCoupon: Partial | null = $state(data.coupon);
let isSubmitting = $state(writable(false));
let formComponent: Form | null = $state(null);
@@ -49,7 +48,9 @@
if (page.url.searchParams.has('coupon')) {
const coupon = page.url.searchParams.get('coupon');
try {
- selectedCoupon = await sdk.forConsole.billing.getCouponAccount(coupon);
+ selectedCoupon = await sdk.forConsole.console.getCoupon({
+ couponId: coupon
+ });
} catch (e) {
selectedCoupon = {
code: null,
@@ -85,7 +86,11 @@
async function validate(organizationId: string, invites: string[]) {
try {
- const org = await sdk.forConsole.billing.validateOrganization(organizationId, invites);
+ const org = await sdk.forConsole.organizations.validatePayment({
+ organizationId,
+ invites
+ });
+
if (isOrganization(org)) {
await preloadData(`${base}/console/organization-${org.$id}`);
await goto(`${base}/console/organization-${org.$id}`);
@@ -105,7 +110,7 @@
async function create() {
try {
- let org: Organization | OrganizationError;
+ let org: Models.Organization | OrganizationError;
if (selectedPlan === BillingPlan.FREE) {
org = await sdk.forConsole.billing.createOrganization(
@@ -149,7 +154,7 @@
}
trackEvent(Submit.OrganizationCreate, {
- plan: tierToPlan(billingPlan)?.name,
+ plan: billingIdToPlan(billingPlan)?.name,
budget_cap_enabled: billingBudget !== null,
members_invited: collaborators?.length
});
diff --git a/src/routes/(console)/create-organization/+page.ts b/src/routes/(console)/create-organization/+page.ts
index 57d6280fe4..2f780b2859 100644
--- a/src/routes/(console)/create-organization/+page.ts
+++ b/src/routes/(console)/create-organization/+page.ts
@@ -1,20 +1,21 @@
-import { BillingPlan, Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
import type { PageLoad } from './$types';
-import type { Coupon } from '$lib/sdk/billing';
-import type { Organization } from '$lib/stores/organization';
+import { type Models, Platform } from '@appwrite.io/console';
+import { BillingPlan, Dependencies } from '$lib/constants';
export const load: PageLoad = async ({ url, parent, depends }) => {
const { organizations } = await parent();
depends(Dependencies.ORGANIZATIONS);
const [coupon, paymentMethods, plans] = await Promise.all([
getCoupon(url),
- sdk.forConsole.billing.listPaymentMethods(),
- sdk.forConsole.billing.listPlans()
+ sdk.forConsole.account.listPaymentMethods(),
+ sdk.forConsole.console.getPlans({
+ platform: Platform.Appwrite
+ })
]);
let plan = getPlanFromUrl(url);
const hasFreeOrganizations = organizations.teams?.some(
- (org) => (org as Organization)?.billingPlan === BillingPlan.FREE
+ (org) => (org as Models.Organization)?.billingPlan === BillingPlan.FREE
);
if (plan === BillingPlan.FREE && hasFreeOrganizations) {
@@ -41,11 +42,13 @@ function getPlanFromUrl(url: URL): BillingPlan | null {
return BillingPlan.FREE;
}
-async function getCoupon(url: URL): Promise {
+async function getCoupon(url: URL): Promise {
if (url.searchParams.has('code')) {
const coupon = url.searchParams.get('code');
try {
- return sdk.forConsole.billing.getCouponAccount(coupon);
+ return sdk.forConsole.account.getCoupon({
+ couponId: coupon
+ });
} catch (e) {
return null;
}
diff --git a/src/routes/(console)/onboarding/create-organization/+page.svelte b/src/routes/(console)/onboarding/create-organization/+page.svelte
index 6ed323c7a2..8923f4e33f 100644
--- a/src/routes/(console)/onboarding/create-organization/+page.svelte
+++ b/src/routes/(console)/onboarding/create-organization/+page.svelte
@@ -1,9 +1,8 @@
diff --git a/src/routes/(console)/organization-[organization]/billing/removeAddress.svelte b/src/routes/(console)/organization-[organization]/billing/removeAddress.svelte
index 0a913b851b..52359ad2c1 100644
--- a/src/routes/(console)/organization-[organization]/billing/removeAddress.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/removeAddress.svelte
@@ -14,7 +14,10 @@
async function removeAddress() {
try {
- await sdk.forConsole.billing.removeBillingAddress($organization.$id);
+ await sdk.forConsole.organizations.deleteBillingAddress({
+ organizationId: $organization.$id
+ });
+
addNotification({
type: 'success',
message: `The billing address has been removed from ${$organization.name}`
diff --git a/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte b/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte
index 5ef49d0261..9fd9c7ff69 100644
--- a/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte
@@ -6,7 +6,6 @@
import { organization } from '$lib/stores/organization';
import { Dependencies } from '$lib/constants';
import { onMount } from 'svelte';
- import type { AddressesList } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { base } from '$app/paths';
@@ -16,8 +15,9 @@
export let show = false;
export let locale: Models.Locale;
export let countryList: Models.CountryList;
+
let loading = true;
- let addresses: AddressesList;
+ let addresses: Models.BillingAddressList;
let selectedAddress: string;
let error: string;
let country: string;
@@ -35,7 +35,7 @@
onMount(async () => {
loading = true;
- addresses = await sdk.forConsole.billing.listAddresses();
+ addresses = await sdk.forConsole.account.listBillingAddresses();
const firstNonCurrentAddress = addresses?.billingAddresses?.find(
(address) => address.$id !== $organization?.billingAddressId
@@ -63,15 +63,19 @@
if (selectedAddress === $organization.billingAddressId) {
show = false;
} else if (selectedAddress === '$new') {
- const address = await sdk.forConsole.billing.createAddress(
+ const address = await sdk.forConsole.account.createBillingAddress({
country,
streetAddress,
city,
state,
- postalCode ? postalCode : undefined,
- addressLine2 ? postalCode : undefined
- );
- await sdk.forConsole.billing.setBillingAddress($organization.$id, address.$id);
+ postalCode: postalCode ? postalCode : undefined,
+ addressLine2: addressLine2 ? postalCode : undefined
+ });
+
+ await sdk.forConsole.organizations.setBillingAddress({
+ organizationId: $organization.$id,
+ billingAddressId: address.$id
+ });
invalidate(Dependencies.ORGANIZATION);
invalidate(Dependencies.ADDRESS);
@@ -86,7 +90,10 @@
message: `Your billing address has been updated`
});
} else {
- await sdk.forConsole.billing.setBillingAddress($organization.$id, selectedAddress);
+ await sdk.forConsole.organizations.setBillingAddress({
+ organizationId: $organization.$id,
+ billingAddressId: selectedAddress
+ });
invalidate(Dependencies.ORGANIZATION);
invalidate(Dependencies.ADDRESS);
diff --git a/src/routes/(console)/organization-[organization]/billing/replaceCard.svelte b/src/routes/(console)/organization-[organization]/billing/replaceCard.svelte
index ea4cc7d267..edb71a016a 100644
--- a/src/routes/(console)/organization-[organization]/billing/replaceCard.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/replaceCard.svelte
@@ -3,27 +3,26 @@
import { FakeModal } from '$lib/components';
import { Button } from '$lib/elements/forms';
import { sdk } from '$lib/stores/sdk';
- import type { Organization } from '$lib/stores/organization';
import { Dependencies } from '$lib/constants';
import { setPaymentMethod, submitStripeCard } from '$lib/stores/stripe';
import { onMount } from 'svelte';
- import type { PaymentList, PaymentMethodData } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { PaymentBoxes } from '$lib/components/billing';
- import type { PaymentMethod } from '@stripe/stripe-js';
+ import type { PaymentMethod as StripePaymentMethod } from '@stripe/stripe-js';
+ import type { Models } from '@appwrite.io/console';
- export let organization: Organization;
export let show = false;
export let isBackup = false;
- export let methods: PaymentList;
+ export let organization: Models.Organization;
+ export let methods: Models.PaymentMethodList;
let name: string;
let error: string = null;
let selectedPaymentMethodId: string;
let showState: boolean = false;
let state: string = '';
- let paymentMethod: PaymentMethod | null = null;
+ let paymentMethod: StripePaymentMethod | null = null;
onMount(async () => {
if (!organization.paymentMethodId && !organization.backupPaymentMethodId) {
@@ -48,19 +47,19 @@
if (showState && !state) {
throw Error('Please select a state');
}
- let method: PaymentMethodData;
+ let method: Models.PaymentMethod;
if (showState) {
method = await setPaymentMethod(paymentMethod.id, name, state);
} else {
const card = await submitStripeCard(name, organization.$id);
if (card && Object.hasOwn(card, 'id')) {
- if ((card as PaymentMethod).card?.country === 'US') {
- paymentMethod = card as PaymentMethod;
+ if ((card as StripePaymentMethod).card?.country === 'US') {
+ paymentMethod = card as StripePaymentMethod;
showState = true;
return;
}
} else if (card && Object.hasOwn(card, '$id')) {
- method = card as PaymentMethodData;
+ method = card as Models.PaymentMethod;
}
}
selectedPaymentMethodId = method.$id;
@@ -89,10 +88,10 @@
async function addPaymentMethod(paymentMethodId: string) {
try {
- await sdk.forConsole.billing.setOrganizationPaymentMethod(
- organization.$id,
+ await sdk.forConsole.organizations.setDefaultPaymentMethod({
+ organizationId: organization.$id,
paymentMethodId
- );
+ });
} catch (e) {
error = e.message;
}
@@ -100,10 +99,10 @@
async function addBackupPaymentMethod(paymentMethodId: string) {
try {
- await sdk.forConsole.billing.setOrganizationPaymentMethodBackup(
- organization.$id,
+ await sdk.forConsole.organizations.setBackupPaymentMethod({
+ organizationId: organization.$id,
paymentMethodId
- );
+ });
} catch (e) {
error = e.message;
}
diff --git a/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte b/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte
index 65e217d2c6..13cbf9fd0f 100644
--- a/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte
@@ -3,7 +3,6 @@
import { FakeModal } from '$lib/components';
import { Button } from '$lib/elements/forms';
import { Dependencies } from '$lib/constants';
- import type { Invoice, PaymentMethodData } from '$lib/sdk/billing';
import { addNotification } from '$lib/stores/notifications';
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { page } from '$app/state';
@@ -21,18 +20,21 @@
import { getApiEndpoint, sdk } from '$lib/stores/sdk';
import { formatCurrency } from '$lib/helpers/numbers';
import { base } from '$app/paths';
- import type { PaymentMethod } from '@stripe/stripe-js';
+ import type { PaymentMethod as StripePaymentMethod } from '@stripe/stripe-js';
+ import type { Models } from '@appwrite.io/console';
export let show = false;
- export let invoice: Invoice;
+ export let invoice: Models.Invoice;
+
+ let name: string;
+ let state: string = '';
let error: string = null;
+ let setAsDefault = false;
let isButtonDisabled = false;
- let name: string;
let paymentMethodId: string;
- let setAsDefault = false;
let showState: boolean = false;
- let state: string = '';
- let paymentMethod: PaymentMethod | null = null;
+ let paymentMethod: StripePaymentMethod | null = null;
+
const endpoint = getApiEndpoint();
onMount(async () => {
@@ -60,15 +62,15 @@
if (showState && !state) {
throw Error('Please select a state');
}
- let method: PaymentMethodData;
+ let method: Models.PaymentMethod;
if (showState) {
method = await setPaymentMethod(paymentMethod.id, name, state);
} else {
const card = await submitStripeCard(name, $organization.$id);
// When Stripe returns an expanded PaymentMethod for US cards, we need state.
- if (Object.hasOwn(card, 'id') && (card as PaymentMethod)?.card) {
- if ((card as PaymentMethod).card?.country === 'US') {
- paymentMethod = card as PaymentMethod;
+ if (Object.hasOwn(card, 'id') && (card as StripePaymentMethod)?.card) {
+ if ((card as StripePaymentMethod).card?.country === 'US') {
+ paymentMethod = card as StripePaymentMethod;
showState = true;
return;
}
@@ -76,10 +78,14 @@
// Otherwise, we expect an Appwrite PaymentMethodData with `$id`.
if (Object.hasOwn(card, '$id')) {
- method = card as PaymentMethodData;
+ method = card as Models.PaymentMethod;
}
}
- const card = await sdk.forConsole.billing.getPaymentMethod(method.$id);
+
+ const card = await sdk.forConsole.account.getPaymentMethod({
+ paymentMethodId: method.$id
+ });
+
if (card?.last4) {
paymentMethodId = card.$id;
} else {
@@ -87,20 +93,27 @@
'The payment method you selected is not valid. Please select a different one.'
);
}
- invalidate(Dependencies.PAYMENT_METHODS);
+
+ await invalidate(Dependencies.PAYMENT_METHODS);
} catch (e) {
paymentMethodId = $organization.paymentMethodId;
error = e.message;
}
}
+
if (setAsDefault) {
- await sdk.forConsole.billing.setDefaultPaymentMethod(paymentMethodId);
+ await sdk.forConsole.organizations.setDefaultPaymentMethod({
+ organizationId: $organization.$id,
+ paymentMethodId
+ });
}
- const { clientSecret, status } = await sdk.forConsole.billing.retryPayment(
- $organization.$id,
- invoice.$id,
- paymentMethodId
- );
+
+ const { clientSecret, status } =
+ await sdk.forConsole.organizations.createInvoicePayment({
+ organizationId: $organization.$id,
+ invoiceId: invoice.$id,
+ paymentMethodId
+ });
if (status !== 'succeeded' && status !== 'cancelled') {
// probably still pending, confirm via stripe!
@@ -111,7 +124,10 @@
`${base}/organization-${$organization.$id}/billing?type=validate-invoice&invoice=${invoice.$id}`
);
- await sdk.forConsole.billing.updateInvoiceStatus($organization.$id, invoice.$id);
+ await sdk.forConsole.organizations.validateInvoice({
+ organizationId: $organization.$id,
+ invoiceId: invoice.$id
+ });
}
invalidate(Dependencies.ORGANIZATION);
diff --git a/src/routes/(console)/organization-[organization]/billing/store.ts b/src/routes/(console)/organization-[organization]/billing/store.ts
index a8f05930a9..e11b695153 100644
--- a/src/routes/(console)/organization-[organization]/billing/store.ts
+++ b/src/routes/(console)/organization-[organization]/billing/store.ts
@@ -1,11 +1,11 @@
import { page } from '$app/stores';
import { derived, writable } from 'svelte/store';
+import type { Models } from '@appwrite.io/console';
import type { WizardStepsType } from '$lib/layout/wizardWithSteps.svelte';
-import type { AggregationList, Invoice, InvoiceUsage } from '$lib/sdk/billing';
export const aggregationList = derived(
page,
- ($page) => $page.data.aggregationList as AggregationList
+ ($page) => $page.data.aggregationList as Models.AggregationTeamList
);
export const addCreditWizardSteps = writable(new Map());
@@ -14,33 +14,33 @@ export const addCreditWizardStore = writable<{ coupon: string; paymentMethodId:
paymentMethodId: null
});
-export const selectedInvoice = writable(null);
+export const selectedInvoice = writable(null);
export const showRetryModal = writable(false);
export type RowFactoryOptions = {
id: string;
label: string;
- resource?: InvoiceUsage;
+ resource?: Models.UsageResources;
planLimit?: number | null;
includeProgress?: boolean;
formatValue?: (value: number | null | undefined) => string;
usageFormatter?: (options: {
value: number;
planLimit?: number | null;
- resource?: InvoiceUsage;
+ resource?: Models.UsageResources;
formatValue: (value: number | null | undefined) => string;
hasLimit: boolean;
}) => string;
- priceFormatter?: (options: { amount: number; resource?: InvoiceUsage }) => string;
+ priceFormatter?: (options: { amount: number; resource?: Models.UsageResources }) => string;
progressFactory?: (options: {
value: number;
planLimit?: number | null;
- resource?: InvoiceUsage;
+ resource?: Models.UsageResources;
hasLimit: boolean;
}) => Array<{ size: number; color: string; tooltip?: { title: string; label: string } }>;
maxFactory?: (options: {
planLimit?: number | null;
hasLimit: boolean;
- resource?: InvoiceUsage;
+ resource?: Models.UsageResources;
}) => number | null;
};
diff --git a/src/routes/(console)/organization-[organization]/billing/taxId.svelte b/src/routes/(console)/organization-[organization]/billing/taxId.svelte
index bbdb664796..bef6cc8444 100644
--- a/src/routes/(console)/organization-[organization]/billing/taxId.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/taxId.svelte
@@ -17,7 +17,10 @@
async function updateTaxId() {
try {
- await sdk.forConsole.billing.updateTaxId($organization.$id, taxId);
+ await sdk.forConsole.organizations.setBillingTaxId({
+ organizationId: $organization.$id,
+ taxId
+ });
await invalidate(Dependencies.ORGANIZATION);
addNotification({
type: 'success',
diff --git a/src/routes/(console)/organization-[organization]/billing/wizard/addCredit.svelte b/src/routes/(console)/organization-[organization]/billing/wizard/addCredit.svelte
index d8933fa6b4..99ece582a8 100644
--- a/src/routes/(console)/organization-[organization]/billing/wizard/addCredit.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/wizard/addCredit.svelte
@@ -1,24 +1,26 @@
-
+
+
diff --git a/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/+page.ts b/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/+page.ts
index fda7fb6a2a..2ed1fc7d71 100644
--- a/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/+page.ts
+++ b/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/+page.ts
@@ -1,18 +1,26 @@
-import { Dependencies } from '$lib/constants';
-import { sdk } from '$lib/stores/sdk';
import { isCloud } from '$lib/system';
-import { Query, Platform } from '@appwrite.io/console';
+import { redirect } from '@sveltejs/kit';
+import { resolve } from '$app/paths';
+import { Dependencies } from '$lib/constants';
+import type { Models } from '@appwrite.io/console';
+import { getTeamOrOrganizationList } from '$lib/stores/organization';
-export const load = async ({ parent, depends }) => {
- depends(Dependencies.DOMAINS);
+export const load = async ({ params, parent, depends }) => {
+ if (!isCloud) {
+ redirect(
+ 303,
+ resolve('/(console)/organization-[organization]', {
+ organization: params.organization
+ })
+ );
+ }
- const organizations = !isCloud
- ? await sdk.forConsole.teams.list()
- : await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ]);
+ depends(Dependencies.DOMAINS);
const { domain } = await parent();
+
+ const organizations = (await getTeamOrOrganizationList()) as Models.OrganizationList;
+
return {
domain,
organizations
diff --git a/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/changeOrganization.svelte b/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/changeOrganization.svelte
index 542ea62ad1..0ecaa38cb8 100644
--- a/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/changeOrganization.svelte
+++ b/src/routes/(console)/organization-[organization]/domains/domain-[domain]/settings/changeOrganization.svelte
@@ -6,12 +6,12 @@
import { Dependencies } from '$lib/constants';
import { Button, InputSelect } from '$lib/elements/forms';
import { addNotification } from '$lib/stores/notifications';
- import type { OrganizationList } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import type { Models } from '@appwrite.io/console';
export let domain: Models.Domain;
- export let organizations: OrganizationList;
+ export let organizations: Models.OrganizationList;
+
let selectedOrg: string = null;
async function moveDomain() {
diff --git a/src/routes/(console)/organization-[organization]/header.svelte b/src/routes/(console)/organization-[organization]/header.svelte
index 191131ae49..ba61eccca1 100644
--- a/src/routes/(console)/organization-[organization]/header.svelte
+++ b/src/routes/(console)/organization-[organization]/header.svelte
@@ -11,16 +11,10 @@
import {
daysLeftInTrial,
getServiceLimit,
- plansInfo,
readOnly,
- tierToPlan
+ billingIdToPlan
} from '$lib/stores/billing';
- import {
- members,
- newMemberModal,
- newOrgModal,
- type Organization
- } from '$lib/stores/organization';
+ import { members, newMemberModal, newOrgModal } from '$lib/stores/organization';
import {
canSeeBilling,
canSeeProjects,
@@ -31,6 +25,7 @@
import { GRACE_PERIOD_OVERRIDE, isCloud } from '$lib/system';
import { IconGithub, IconPlus, IconPlusSm } from '@appwrite.io/pink-icons-svelte';
import { Badge, Icon, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte';
+ import type { Models } from '@appwrite.io/console';
let areMembersLimited: boolean = $state(false);
@@ -42,7 +37,7 @@
(($readOnly && !GRACE_PERIOD_OVERRIDE) || (isLimited && $members?.total >= limit));
});
- const organization = $derived(page.data.organization as Organization);
+ const organization = $derived(page.data.organization as Models.Organization);
const path = $derived(`${base}/organization-${organization.$id}`);
const tabs = $derived(
@@ -110,7 +105,7 @@
{:else if isCloud && organization?.billingPlan === BillingPlan.FREE}
{/if}
- {#if isCloud && organization?.billingTrialStartDate && $daysLeftInTrial > 0 && organization.billingPlan !== BillingPlan.FREE && $plansInfo.get(organization.billingPlan)?.trialDays}
+ {#if isCloud && organization?.billingTrialStartDate && $daysLeftInTrial > 0 && organization.billingPlan !== BillingPlan.FREE && organization?.billingTrialDays}
@@ -153,7 +148,7 @@
{organization?.billingPlan === BillingPlan.FREE
? 'Upgrade to add more members'
: `You've reached the members limit for the ${
- tierToPlan(organization?.billingPlan)?.name
+ billingIdToPlan(organization?.billingPlan)?.name
} plan`}
diff --git a/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/download/+page.ts b/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/download/+page.ts
index de6e172699..3a0e31cbd3 100644
--- a/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/download/+page.ts
+++ b/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/download/+page.ts
@@ -4,7 +4,10 @@ import type { PageLoad } from './$types';
export const load: PageLoad = async ({ params }) => {
// verify invoice exists
- const invoice = await sdk.forConsole.billing.getInvoice(params.organization, params.invoiceId);
+ const invoice = await sdk.forConsole.organizations.getInvoice({
+ organizationId: params.organization,
+ invoiceId: params.invoiceId
+ });
const endpoint = getApiEndpoint();
return redirect(
diff --git a/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts b/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts
index bfd0e5b082..3a4576785e 100644
--- a/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts
+++ b/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts
@@ -4,7 +4,11 @@ import type { PageLoad } from './$types';
export const load: PageLoad = async ({ params }) => {
// verify invoice exists
- const invoice = await sdk.forConsole.billing.getInvoice(params.organization, params.invoiceId);
+ const invoice = await sdk.forConsole.organizations.getInvoice({
+ organizationId: params.organization,
+ invoiceId: params.invoiceId
+ });
+
const endpoint = getApiEndpoint();
return redirect(
diff --git a/src/routes/(console)/organization-[organization]/members/+page.svelte b/src/routes/(console)/organization-[organization]/members/+page.svelte
index 05c3500802..c9ad661504 100644
--- a/src/routes/(console)/organization-[organization]/members/+page.svelte
+++ b/src/routes/(console)/organization-[organization]/members/+page.svelte
@@ -35,7 +35,7 @@
Tooltip
} from '@appwrite.io/pink-svelte';
import { BillingPlan } from '$lib/constants';
- import { tierToPlan } from '$lib/stores/billing';
+ import { billingIdToPlan } from '$lib/stores/billing';
export let data;
@@ -92,7 +92,7 @@
{$organization?.billingPlan === BillingPlan.FREE
? 'Upgrade to add more members'
: `You've reached the members limit for the ${
- tierToPlan($organization?.billingPlan)?.name
+ billingIdToPlan($organization?.billingPlan)?.name
} plan`}
diff --git a/src/routes/(console)/organization-[organization]/settings/+page.ts b/src/routes/(console)/organization-[organization]/settings/+page.ts
index ffecda25ac..776ea7fcb1 100644
--- a/src/routes/(console)/organization-[organization]/settings/+page.ts
+++ b/src/routes/(console)/organization-[organization]/settings/+page.ts
@@ -10,7 +10,11 @@ export const load: PageLoad = async ({ depends, params, parent }) => {
const [projects, invoices] = await Promise.all([
sdk.forConsole.projects.list({ queries: [Query.equal('teamId', params.organization)] }),
- isCloud ? sdk.forConsole.billing.listInvoices(params.organization) : undefined
+ isCloud
+ ? sdk.forConsole.organizations.listInvoices({
+ organizationId: params.organization
+ })
+ : undefined
]);
return {
diff --git a/src/routes/(console)/organization-[organization]/settings/deleteOrganizationEstimation.svelte b/src/routes/(console)/organization-[organization]/settings/deleteOrganizationEstimation.svelte
index e521985a52..14ae7d8bcb 100644
--- a/src/routes/(console)/organization-[organization]/settings/deleteOrganizationEstimation.svelte
+++ b/src/routes/(console)/organization-[organization]/settings/deleteOrganizationEstimation.svelte
@@ -1,8 +1,9 @@
{#if estimation}
diff --git a/src/routes/(console)/organization-[organization]/settings/deleteOrganizationModal.svelte b/src/routes/(console)/organization-[organization]/settings/deleteOrganizationModal.svelte
index dab95d83a3..51a1d483aa 100644
--- a/src/routes/(console)/organization-[organization]/settings/deleteOrganizationModal.svelte
+++ b/src/routes/(console)/organization-[organization]/settings/deleteOrganizationModal.svelte
@@ -12,23 +12,25 @@
import { toLocaleDate } from '$lib/helpers/date';
import { isCloud } from '$lib/system';
import { formatCurrency } from '$lib/helpers/numbers';
- import { tierToPlan } from '$lib/stores/billing';
+ import { billingIdToPlan } from '$lib/stores/billing';
import { Table, Tabs, Alert } from '@appwrite.io/pink-svelte';
import DeleteOrganizationEstimation from './deleteOrganizationEstimation.svelte';
- import type { EstimationDeleteOrganization, InvoiceList } from '$lib/sdk/billing';
+ import type { Models } from '@appwrite.io/console';
export let showDelete = false;
- export let invoices: InvoiceList;
- let error: string = null;
+ export let invoices: Models.InvoiceList;
+ let error: string = null;
let selectedTab = 'projects';
let organizationName: string = null;
- let estimation: EstimationDeleteOrganization;
+ let estimation: Models.EstimationDeleteOrganization;
async function deleteOrg() {
try {
if (isCloud) {
- await sdk.forConsole.billing.deleteOrganization($organization.$id);
+ await sdk.forConsole.organizations.delete({
+ organizationId: $organization.$id
+ });
} else {
await sdk.forConsole.teams.delete({
teamId: $organization.$id
@@ -82,9 +84,9 @@
if (isCloud) {
try {
error = '';
- estimation = await sdk.forConsole.billing.estimationDeleteOrganization(
- $organization.$id
- );
+ estimation = await sdk.forConsole.organizations.estimationDeleteOrganization({
+ organizationId: $organization.$id
+ });
} catch (e) {
error = e.message;
}
@@ -97,7 +99,7 @@
+ ${billingIdToPlan(upcomingInvoice.plan).name} plan`}>
By proceeding, your invoice will be processed within the hour. Upon successful payment,
your organization will be deleted.
@@ -112,7 +114,8 @@
This action is irreversible .
{/if}
- {#if estimation && (estimation.unpaidInvoices.length > 0 || estimation.grossAmount > 0)}
+
+ {#if estimation && (estimation.unpaidInvoices.length > 0 || estimation.unpaidInvoices.some((invoice) => invoice.grossAmount > 0))}
{:else}
{#if $projects.total > 0}
diff --git a/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte b/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte
index 84b7ca6093..514e8a575a 100644
--- a/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte
+++ b/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte
@@ -1,5 +1,4 @@
diff --git a/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.ts
index e5e1ee5a6c..0efb7c6020 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.ts
@@ -1,53 +1,59 @@
-import type { AggregationTeam, Invoice, InvoiceUsage } from '$lib/sdk/billing';
-import { accumulateUsage } from '$lib/sdk/usage';
import { sdk } from '$lib/stores/sdk';
-import { Query } from '@appwrite.io/console';
import type { PageLoad } from './$types';
+import { accumulateUsage } from '$lib/sdk/usage';
+import { type Models, Query } from '@appwrite.io/console';
export const load: PageLoad = async ({ params, parent }) => {
- const { invoice, project, region } = params;
+ const { invoice: invoiceId, project, region } = params;
const { organization } = await parent();
let startDate: string = organization.billingCurrentInvoiceDate;
let endDate: string = organization.billingNextInvoiceDate;
- let currentInvoice: Invoice = undefined;
- let currentAggregation: AggregationTeam = undefined;
+ let currentInvoice: Models.Invoice = undefined;
+ let currentAggregation: Models.AggregationTeam = undefined;
- if (invoice) {
- currentInvoice = await sdk.forConsole.billing.getInvoice(organization.$id, invoice);
- currentAggregation = await sdk.forConsole.billing.getAggregation(
- organization.$id,
- currentInvoice.aggregationId
- );
+ if (invoiceId) {
+ currentInvoice = await sdk.forConsole.organizations.getInvoice({
+ organizationId: organization.$id,
+ invoiceId
+ });
+ currentAggregation = await sdk.forConsole.organizations.getAggregation({
+ organizationId: organization.$id,
+ aggregationId: currentInvoice.aggregationId
+ });
startDate = currentInvoice.from;
endDate = currentInvoice.to;
} else {
try {
- currentAggregation = await sdk.forConsole.billing.getAggregation(
- organization.$id,
- organization.billingAggregationId
- );
+ currentAggregation = await sdk.forConsole.organizations.getAggregation({
+ organizationId: organization.$id,
+ aggregationId: organization.billingAggregationId
+ });
} catch (e) {
// ignore error if no aggregation found
}
}
const [invoices, usage] = await Promise.all([
- sdk.forConsole.billing.listInvoices(organization.$id, [Query.orderDesc('from')]),
+ sdk.forConsole.organizations.listInvoices({
+ organizationId: organization.$id,
+ queries: [Query.orderDesc('from')]
+ }),
sdk.forProject(region, project).project.getUsage({ startDate, endDate })
]);
if (currentAggregation) {
- let projectSpecificData = null;
+ let projectSpecificData: Models.AggregationBreakdown | null = null;
if (currentAggregation.breakdown) {
projectSpecificData = currentAggregation.breakdown.find((p) => p.$id === project);
}
if (projectSpecificData) {
const executionsResource = projectSpecificData.resources?.find?.(
- (r: InvoiceUsage) => r.resourceId === 'executions'
+ (resource) => resource.resourceId === 'executions'
);
+
if (executionsResource) {
usage.executionsTotal = executionsResource.value || usage.executionsTotal;
}
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/settings/updateMaxFileSize.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/settings/updateMaxFileSize.svelte
index 6e8b681dce..a58dbc1743 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/settings/updateMaxFileSize.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/settings/updateMaxFileSize.svelte
@@ -10,11 +10,10 @@
import { organization } from '$lib/stores/organization';
import { GRACE_PERIOD_OVERRIDE, isCloud } from '$lib/system';
import { updateBucket } from './+page.svelte';
- import type { Plan } from '$lib/sdk/billing';
import type { Models } from '@appwrite.io/console';
export let bucket: Models.Bucket;
- export let currentPlan: Plan | null;
+ export let currentPlan: Models.BillingPlan | null;
const service = currentPlan ? currentPlan['fileSize'] : null;
const { value, unit, baseValue, units } = createByteUnitPair(bucket.maximumFileSize, 1000);
diff --git a/src/routes/(console)/regions.ts b/src/routes/(console)/regions.ts
index 32dbd0308e..404ee92096 100644
--- a/src/routes/(console)/regions.ts
+++ b/src/routes/(console)/regions.ts
@@ -21,10 +21,11 @@ export async function loadAvailableRegions(orgId: string, force: boolean = false
return;
}
- // TODO: @itznotabug, @torstendittmann we need a better way for this!
- const availableRegions = await sdk.forConsole.billing.listRegions(orgId);
- regions.set(availableRegions);
+ const availableRegions = await sdk.forConsole.console.getRegions({
+ organizationId: orgId
+ });
+ regions.set(availableRegions);
lastLoadedOrganization = orgId;
} catch (error) {
console.error(`Failed to load regions for teamId: ${orgId}`, error);
diff --git a/src/routes/(console)/store.ts b/src/routes/(console)/store.ts
index 359a71b30f..a21c994510 100644
--- a/src/routes/(console)/store.ts
+++ b/src/routes/(console)/store.ts
@@ -1,6 +1,5 @@
import { page } from '$app/stores';
import type { HeaderAlert } from '$lib/stores/headerAlert';
-import type { Organization } from '$lib/stores/organization';
import type { Models } from '@appwrite.io/console';
import { derived, writable } from 'svelte/store';
@@ -16,4 +15,4 @@ export const protocol = derived(consoleVariables, ($vars) =>
);
export const activeHeaderAlert = writable(null);
-export const orgMissingPaymentMethod = writable(null);
+export const orgMissingPaymentMethod = writable(null);
diff --git a/src/routes/(public)/(guest)/login/+page.ts b/src/routes/(public)/(guest)/login/+page.ts
index 33d808b7e5..5aac9163a0 100644
--- a/src/routes/(public)/(guest)/login/+page.ts
+++ b/src/routes/(public)/(guest)/login/+page.ts
@@ -1,34 +1,40 @@
-import { base } from '$app/paths';
-import type { Campaign } from '$lib/stores/campaigns';
+import { resolve } from '$app/paths';
import { sdk } from '$lib/stores/sdk';
import { redirect } from '@sveltejs/kit';
import type { PageLoad } from './$types';
+import type { Models } from '@appwrite.io/console';
export const load: PageLoad = async ({ url }) => {
if (url.searchParams.has('code')) {
const code = url.searchParams.get('code');
- let campaign: Campaign;
+ let campaign: Models.Campaign;
try {
- const couponData = await sdk.forConsole.billing.getCoupon(code);
+ const couponData = await sdk.forConsole.console.getCoupon({
+ couponId: code
+ });
+
if (couponData.campaign) {
- campaign = await sdk.forConsole.billing.getCampaign(couponData.campaign);
+ campaign = await sdk.forConsole.console.getCampaign({
+ campaignId: couponData.campaign
+ });
return {
couponData,
campaign
};
- } else redirect(303, `${base}/login`);
+ } else redirect(303, resolve('/login'));
} catch (e) {
- redirect(303, `${base}/login`);
+ redirect(303, resolve('/login'));
}
}
+
if (url.searchParams.has('campaign')) {
const campaignId = url.searchParams.get('campaign');
- let campaign: Campaign;
+ let campaign: Models.Campaign;
try {
- campaign = await sdk.forConsole.billing.getCampaign(campaignId);
+ campaign = await sdk.forConsole.console.getCampaign({ campaignId });
return { campaign };
} catch (e) {
- redirect(303, `${base}/login`);
+ redirect(303, resolve('/login'));
}
}
return;
diff --git a/src/routes/(public)/(guest)/register/+page.ts b/src/routes/(public)/(guest)/register/+page.ts
index 1fa2e79de8..6f3dfe81ef 100644
--- a/src/routes/(public)/(guest)/register/+page.ts
+++ b/src/routes/(public)/(guest)/register/+page.ts
@@ -1,34 +1,40 @@
-import { base } from '$app/paths';
-import type { Campaign } from '$lib/stores/campaigns.js';
+import { resolve } from '$app/paths';
import { sdk } from '$lib/stores/sdk';
import { redirect } from '@sveltejs/kit';
import type { PageLoad } from './$types';
+import type { Models } from '@appwrite.io/console';
export const load: PageLoad = async ({ url }) => {
if (url.searchParams.has('code')) {
const code = url.searchParams.get('code');
- let campaign: Campaign;
+ let campaign: Models.Campaign;
try {
- const couponData = await sdk.forConsole.billing.getCoupon(code);
+ const couponData = await sdk.forConsole.console.getCoupon({
+ couponId: code
+ });
+
if (couponData.campaign) {
- campaign = await sdk.forConsole.billing.getCampaign(couponData.campaign);
+ campaign = await sdk.forConsole.console.getCampaign({
+ campaignId: couponData.campaign
+ });
return {
couponData,
campaign
};
- } else redirect(303, `${base}/register`);
+ } else redirect(303, resolve('/register'));
} catch (e) {
- redirect(303, `${base}/register`);
+ redirect(303, resolve('/register'));
}
}
+
if (url.searchParams.has('campaign')) {
const campaignId = url.searchParams.get('campaign');
- let campaign: Campaign;
+ let campaign: Models.Campaign;
try {
- campaign = await sdk.forConsole.billing.getCampaign(campaignId);
+ campaign = await sdk.forConsole.console.getCampaign({ campaignId });
return { campaign };
} catch (e) {
- redirect(303, `${base}/register`);
+ redirect(303, resolve('/register'));
}
}
return;
diff --git a/src/routes/(public)/functions/deploy/+page.ts b/src/routes/(public)/functions/deploy/+page.ts
index d91d084ff8..404d3ae47e 100644
--- a/src/routes/(public)/functions/deploy/+page.ts
+++ b/src/routes/(public)/functions/deploy/+page.ts
@@ -3,8 +3,8 @@ import { redirect } from '@sveltejs/kit';
import { base } from '$app/paths';
import { isCloud } from '$lib/system';
import { BillingPlan } from '$lib/constants';
-import { ID, type Models, Query, Platform } from '@appwrite.io/console';
-import type { OrganizationList } from '$lib/stores/organization';
+import { ID } from '@appwrite.io/console';
+import { getTeamOrOrganizationList } from '$lib/stores/organization';
import { redirectTo } from '$routes/store';
import type { PageLoad } from './$types';
import { getRepositoryInfo } from '$lib/helpers/github';
@@ -64,14 +64,7 @@ export const load: PageLoad = async ({ parent, url }) => {
deploymentData.repository.owner = info.owner;
// Get organizations
- let organizations: Models.TeamList> | OrganizationList | undefined;
- if (isCloud) {
- organizations = await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ]);
- } else {
- organizations = await sdk.forConsole.teams.list();
- }
+ let organizations = await getTeamOrOrganizationList();
if (!organizations?.total) {
try {
@@ -89,13 +82,7 @@ export const load: PageLoad = async ({ parent, url }) => {
});
}
- if (isCloud) {
- organizations = await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ]);
- } else {
- organizations = await sdk.forConsole.teams.list();
- }
+ organizations = await getTeamOrOrganizationList();
} catch (e) {
console.error('Failed to create default organization:', e);
}
diff --git a/src/routes/(public)/sites/deploy/+page.ts b/src/routes/(public)/sites/deploy/+page.ts
index ca57d36e34..79bea62d31 100644
--- a/src/routes/(public)/sites/deploy/+page.ts
+++ b/src/routes/(public)/sites/deploy/+page.ts
@@ -3,8 +3,8 @@ import { redirect, error } from '@sveltejs/kit';
import { base } from '$app/paths';
import { isCloud } from '$lib/system';
import { BillingPlan } from '$lib/constants';
-import { ID, type Models, Query, Platform } from '@appwrite.io/console';
-import type { OrganizationList } from '$lib/stores/organization';
+import { ID, type Models } from '@appwrite.io/console';
+import { getTeamOrOrganizationList } from '$lib/stores/organization';
import { redirectTo } from '$routes/store';
import type { PageLoad } from './$types';
import { getRepositoryInfo } from '$lib/helpers/github';
@@ -80,15 +80,7 @@ export const load: PageLoad = async ({ parent, url }) => {
};
}
- let organizations: Models.TeamList> | OrganizationList | undefined;
-
- if (isCloud) {
- organizations = await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ]);
- } else {
- organizations = await sdk.forConsole.teams.list();
- }
+ let organizations = await getTeamOrOrganizationList();
if (!organizations?.total) {
try {
@@ -107,13 +99,7 @@ export const load: PageLoad = async ({ parent, url }) => {
}
// Refetch organizations after creation
- if (isCloud) {
- organizations = await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ]);
- } else {
- organizations = await sdk.forConsole.teams.list();
- }
+ organizations = await getTeamOrOrganizationList();
} catch (e) {
console.error('Failed to create default organization:', e);
}
diff --git a/src/routes/(public)/template-[template]/+page.ts b/src/routes/(public)/template-[template]/+page.ts
index e2dac3adfa..92890ff1cf 100644
--- a/src/routes/(public)/template-[template]/+page.ts
+++ b/src/routes/(public)/template-[template]/+page.ts
@@ -1,11 +1,11 @@
-import { BillingPlan } from '$lib/constants.js';
+import { base } from '$app/paths';
import { sdk } from '$lib/stores/sdk.js';
-import { ID, type Models, Query, Platform } from '@appwrite.io/console';
import { isCloud } from '$lib/system.js';
-import { error, redirect } from '@sveltejs/kit';
-import type { OrganizationList } from '$lib/stores/organization.js';
import { redirectTo } from '$routes/store.js';
-import { base } from '$app/paths';
+import { error, redirect } from '@sveltejs/kit';
+import { getBasePlanFromGroup } from '$lib/stores/billing';
+import { getTeamOrOrganizationList } from '$lib/stores/organization.js';
+import { BillingPlanGroup, ID, type Models } from '@appwrite.io/console';
export const load = async ({ parent, url, params }) => {
const { account } = await parent();
@@ -37,22 +37,13 @@ export const load = async ({ parent, url, params }) => {
error(404, 'Type is not valid');
}
- let organizations: Models.TeamList> | OrganizationList | undefined;
- if (isCloud) {
- organizations = account?.$id
- ? await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ])
- : undefined;
- } else {
- organizations = account?.$id ? await sdk.forConsole.teams.list() : undefined;
- }
+ const organizations = account?.$id ? await getTeamOrOrganizationList() : undefined;
if (!organizations?.total && account?.$id) {
await sdk.forConsole.billing.createOrganization(
ID.unique(),
'Personal project',
- BillingPlan.FREE,
+ getBasePlanFromGroup(BillingPlanGroup.Starter).$id,
null
);
}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 571542d06f..ce32145cf5 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -68,11 +68,16 @@
if (page.url.searchParams.has('code')) {
const code = page.url.searchParams.get('code');
- const coupon = await sdk.forConsole.billing.getCoupon(code).catch(() => null);
+ const coupon = await sdk.forConsole.console
+ .getCoupon({
+ couponId: code
+ })
+ .catch(() => null);
if (coupon?.campaign) {
- const campaign = await sdk.forConsole.billing
- .getCampaign(coupon.campaign)
+ const campaign = await sdk.forConsole.console
+ .getCampaign({ campaignId: coupon.campaign })
.catch(() => null);
+
if (campaign && $user) {
goto(`${base}/apply-credit?${page.url.searchParams}`);
loading.set(false);
@@ -83,9 +88,10 @@
if ($user && page.url.searchParams.has('campaign')) {
const campaignId = page.url.searchParams.get('campaign');
- const campaign = await sdk.forConsole.billing
- .getCampaign(campaignId)
+ const campaign = await sdk.forConsole.console
+ .getCampaign({ campaignId })
.catch(() => null);
+
if (campaign) {
goto(`${base}/apply-credit?${page.url.searchParams}`);
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
index bcd3e307ff..a80e909b98 100644
--- a/src/routes/+layout.ts
+++ b/src/routes/+layout.ts
@@ -8,9 +8,10 @@ import type { LayoutLoad } from './$types';
import { redirectTo } from './store';
import { base, resolve } from '$app/paths';
import type { Account } from '$lib/stores/user';
-import { type AppwriteException, Query, Platform } from '@appwrite.io/console';
+import { type AppwriteException } from '@appwrite.io/console';
import { isCloud, VARS } from '$lib/system';
import { checkPricingRefAndRedirect } from '$lib/helpers/pricingRedirect';
+import { getTeamOrOrganizationList } from '$lib/stores/organization';
export const ssr = false;
@@ -40,11 +41,7 @@ export const load: LayoutLoad = async ({ depends, url, route }) => {
return {
account: account,
- organizations: !isCloud
- ? await sdk.forConsole.teams.list()
- : await sdk.forConsole.billing.listOrganization([
- Query.equal('platform', Platform.Appwrite)
- ])
+ organizations: await getTeamOrOrganizationList()
};
}
diff --git a/src/routes/+page.ts b/src/routes/+page.ts
index ea9e97cb82..e9600a4267 100644
--- a/src/routes/+page.ts
+++ b/src/routes/+page.ts
@@ -1,23 +1,24 @@
import { redirect } from '@sveltejs/kit';
-import { base } from '$app/paths';
+import { base, resolve } from '$app/paths';
import type { PageLoad } from './$types';
import { sdk } from '$lib/stores/sdk';
import { VARS } from '$lib/system';
const handleGithubEducationMembership = async (name: string, email: string) => {
- const result = await sdk.forConsole.billing.setMembership('github-student-developer');
- if (result && 'error' in result) {
- if (result.error.code === 409) {
- redirect(303, `${base}/account/organizations`);
+ try {
+ await sdk.forConsole.console.createProgramMembership({
+ programId: 'github-student-developer'
+ });
+
+ await setToGhStudentMailingList(name, email);
+ } catch (error) {
+ if (error.code === 409) {
+ redirect(303, resolve('/(console)/account/organizations'));
} else {
await sdk.forConsole.account.deleteSession({ sessionId: 'current' });
- redirect(
- 303,
- `${base}/education/error?message=${result.error.message}&code=${result.error.code}`
- );
+ const errorUrl = resolve('/(public)/(guest)/education/error');
+ redirect(303, `${errorUrl}?message=${error.message}&code=${error.code}`);
}
- } else if (result && '$createdAt' in result) {
- setToGhStudentMailingList(name, email);
}
};
@@ -35,7 +36,7 @@ export const load: PageLoad = async ({ parent, url }) => {
if (userVisitedEducationPage()) {
await handleGithubEducationMembership(account.name, account.email);
- redirect(303, base);
+ redirect(303, resolve('/'));
} else if (organizations.total && !isApplyingCredit) {
const teamId = account.prefs.organization ?? organizations.teams[0].$id;
if (!teamId) {