Skip to content

Commit 9042ca6

Browse files
committed
refactored error handling and resource blocked message
1 parent 5a594e0 commit 9042ca6

File tree

29 files changed

+331
-467
lines changed

29 files changed

+331
-467
lines changed

src/global.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ interface Window { }
44
namespace App {
55
interface Error {
66
type: string = 'unknown',
7-
resource: string = 'project',
7+
}
8+
9+
interface HandleClientError {
10+
message: string;
11+
status?: number;
12+
type: string;
813
}
914
}

src/hooks.client.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ Sentry.init({
1313

1414
export const handleError: HandleClientError = ({ error, message, status }) => {
1515
console.error(error);
16+
let type = 'unknown';
1617
if (error instanceof AppwriteException) {
1718
status = error.code === 0 ? undefined : error.code;
1819
message = error.message;
20+
type = error.type
1921
}
2022

2123
return {
2224
message,
23-
status
24-
};
25+
status,
26+
type
27+
}
2528
};

src/routes/(console)/project-[region]-[project]/+error.svelte

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
1-
<script>
1+
<script lang="ts">
22
import { page } from '$app/state';
33
import { Container } from '$lib/layout';
44
import { Card, Typography } from '@appwrite.io/pink-svelte';
5+
function getResource(id: string) {
6+
id = id.replace('/(console)/project-[region]-[project]/', '');
7+
let parts = id.split('/');
8+
const resource = parts[0];
9+
10+
return resource === 'settings' ? 'project' : resource;
11+
}
512
</script>
613

714
<Container>
815
{#if page.error.type === 'general_resource_blocked'}
9-
{@const resource = page.error.resource || 'project'}
16+
{@const resource = getResource(page.route.id)}
1017
<Card.Base>
1118
<Typography.Title size="s">Your {resource} is paused</Typography.Title>
1219
<p class="text-red-500">
Lines changed: 40 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Dependencies } from '$lib/constants';
22
import { sdk } from '$lib/stores/sdk';
3-
import { error } from '@sveltejs/kit';
43
import type { LayoutLoad } from './$types';
54
import { preferences } from '$lib/stores/preferences';
65
import { failedInvoice } from '$lib/stores/billing';
@@ -17,50 +16,47 @@ export const load: LayoutLoad = async ({ params, depends }) => {
1716
depends(Dependencies.PROJECT);
1817
let currentPlan: Plan = null;
1918

20-
try {
21-
const project = await sdk.forConsole.projects.get(params.project);
22-
const [organization, prefs, regionalConsoleVariables, _] = await Promise.all([
23-
sdk.forConsole.teams.get(project.teamId) as Promise<Organization>,
24-
sdk.forConsole.account.getPrefs(),
25-
sdk.forConsoleIn(project.region).console.variables(),
26-
loadAvailableRegions(project.teamId)
27-
]);
28-
if (prefs?.organization !== project.teamId) {
29-
sdk.forConsole.account.updatePrefs({
30-
...prefs,
31-
organization: project.teamId
32-
});
33-
}
34-
await preferences.loadTeamPrefs(project.teamId);
35-
let roles = isCloud ? [] : defaultRoles;
36-
let scopes = isCloud ? [] : defaultScopes;
37-
if (isCloud) {
38-
currentPlan = await sdk.forConsole.billing.getOrganizationPlan(project.teamId);
39-
const res = await sdk.forConsole.billing.getRoles(project.teamId);
40-
roles = res.roles;
41-
scopes = res.scopes;
42-
if (scopes.includes('billing.read')) {
43-
await failedInvoice.load(project.teamId);
44-
if (get(failedInvoice)) {
45-
headerAlert.add({
46-
show: true,
47-
component: PaymentFailed,
48-
id: 'paymentFailed',
49-
importance: 1
50-
});
51-
}
19+
const project = await sdk.forConsole.projects.get(params.project);
20+
const [organization, prefs, regionalConsoleVariables, _] = await Promise.all([
21+
sdk.forConsole.teams.get(project.teamId) as Promise<Organization>,
22+
sdk.forConsole.account.getPrefs(),
23+
sdk.forConsoleIn(project.region).console.variables(),
24+
loadAvailableRegions(project.teamId)
25+
]);
26+
if (prefs?.organization !== project.teamId) {
27+
sdk.forConsole.account.updatePrefs({
28+
...prefs,
29+
organization: project.teamId
30+
});
31+
}
32+
await preferences.loadTeamPrefs(project.teamId);
33+
let roles = isCloud ? [] : defaultRoles;
34+
let scopes = isCloud ? [] : defaultScopes;
35+
if (isCloud) {
36+
currentPlan = await sdk.forConsole.billing.getOrganizationPlan(project.teamId);
37+
const res = await sdk.forConsole.billing.getRoles(project.teamId);
38+
roles = res.roles;
39+
scopes = res.scopes;
40+
if (scopes.includes('billing.read')) {
41+
await failedInvoice.load(project.teamId);
42+
if (get(failedInvoice)) {
43+
headerAlert.add({
44+
show: true,
45+
component: PaymentFailed,
46+
id: 'paymentFailed',
47+
importance: 1
48+
});
5249
}
5350
}
54-
55-
return {
56-
project,
57-
organization,
58-
regionalConsoleVariables,
59-
roles,
60-
scopes,
61-
currentPlan
62-
};
63-
} catch (e) {
64-
error(e.code, e.message);
6551
}
52+
53+
return {
54+
project,
55+
organization,
56+
regionalConsoleVariables,
57+
roles,
58+
scopes,
59+
currentPlan
60+
};
61+
6662
};

src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@ import Header from './header.svelte';
33
import { sdk } from '$lib/stores/sdk';
44
import type { LayoutLoad } from './$types';
55
import { Dependencies } from '$lib/constants';
6-
import { error } from '@sveltejs/kit';
76

87
export const load: LayoutLoad = async ({ params, depends }) => {
98
depends(Dependencies.TEAM);
10-
try {
11-
return {
12-
header: Header,
13-
breadcrumbs: Breadcrumbs,
14-
team: await sdk.forProject(params.region, params.project).teams.get(params.team)
15-
};
16-
} catch (e) {
17-
error(e.code, e.message);
18-
}
9+
return {
10+
header: Header,
11+
breadcrumbs: Breadcrumbs,
12+
team: await sdk.forProject(params.region, params.project).teams.get(params.team)
13+
};
14+
1915
};

src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@ import { isValueOfStringEnum } from '$lib/helpers/types';
22
import { sdk } from '$lib/stores/sdk';
33
import { UserUsageRange } from '@appwrite.io/console';
44
import type { PageLoad } from './$types';
5-
import { error } from '@sveltejs/kit';
65

76
export const load: PageLoad = async ({ params }) => {
87
const period = isValueOfStringEnum(UserUsageRange, params.period)
98
? params.period
109
: UserUsageRange.ThirtyDays;
11-
try {
12-
return sdk.forProject(params.region, params.project).users.getUsage(period);
13-
} catch (e) {
14-
error(e.code, e.message);
15-
}
10+
return sdk.forProject(params.region, params.project).users.getUsage(period);
11+
1612
};

src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,19 @@ import Breadcrumbs from './breadcrumbs.svelte';
33
import Header from './header.svelte';
44
import { sdk } from '$lib/stores/sdk';
55
import { Dependencies } from '$lib/constants';
6-
import { error } from '@sveltejs/kit';
76

87
export const load: LayoutLoad = async ({ params, depends }) => {
98
depends(Dependencies.USER);
109

11-
try {
12-
const [user, userFactors] = await Promise.all([
13-
sdk.forProject(params.region, params.project).users.get(params.user),
14-
sdk.forProject(params.region, params.project).users.listMfaFactors(params.user)
15-
]);
10+
const [user, userFactors] = await Promise.all([
11+
sdk.forProject(params.region, params.project).users.get(params.user),
12+
sdk.forProject(params.region, params.project).users.listMfaFactors(params.user)
13+
]);
1614

17-
return {
18-
header: Header,
19-
breadcrumbs: Breadcrumbs,
20-
user,
21-
userFactors
22-
};
23-
} catch (e) {
24-
error(e.code, e.message);
25-
}
15+
return {
16+
header: Header,
17+
breadcrumbs: Breadcrumbs,
18+
user,
19+
userFactors
20+
};
2621
};

src/routes/(console)/project-[region]-[project]/databases/+page.ts

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type { BackupPolicy } from '$lib/sdk/backups';
88
import { isSelfHosted } from '$lib/system';
99
import { isCloud } from '$lib/system';
1010
import type { Plan } from '$lib/sdk/billing';
11-
import { error } from '@sveltejs/kit';
1211

1312
export const load: PageLoad = async ({ url, route, depends, params, parent }) => {
1413
depends(Dependencies.DATABASES);
@@ -22,31 +21,22 @@ export const load: PageLoad = async ({ url, route, depends, params, parent }) =>
2221
// already loaded by parent.
2322
const { currentPlan } = await parent();
2423

25-
try {
26-
const { databases, policies, lastBackups } = await fetchDatabasesAndBackups(
27-
limit,
28-
offset,
29-
params,
30-
search,
31-
currentPlan
32-
);
33-
return {
34-
offset,
35-
limit,
36-
view,
37-
search,
38-
policies,
39-
databases,
40-
lastBackups
41-
};
42-
43-
} catch (e) {
44-
error(e.status || 500, {
45-
message: e.message,
46-
type: e.type || 'unknown',
47-
resource: 'databases'
48-
});
49-
}
24+
const { databases, policies, lastBackups } = await fetchDatabasesAndBackups(
25+
limit,
26+
offset,
27+
params,
28+
search,
29+
currentPlan
30+
);
31+
return {
32+
offset,
33+
limit,
34+
view,
35+
search,
36+
policies,
37+
databases,
38+
lastBackups
39+
};
5040
};
5141

5242
async function fetchDatabasesAndBackups(
Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
import { sdk } from '$lib/stores/sdk';
22
import { Dependencies } from '$lib/constants';
3-
import { error } from '@sveltejs/kit';
43
import type { LayoutLoad } from './$types';
54
import Breadcrumbs from './breadcrumbs.svelte';
65
import Header from './header.svelte';
76

87
export const load: LayoutLoad = async ({ params, depends }) => {
98
depends(Dependencies.DATABASE);
109

11-
try {
12-
return {
13-
header: Header,
14-
breadcrumbs: Breadcrumbs,
15-
database: await sdk
16-
.forProject(params.region, params.project)
17-
.databases.get(params.database)
18-
};
19-
} catch (e) {
20-
error(e.code, e.message);
21-
}
10+
return {
11+
header: Header,
12+
breadcrumbs: Breadcrumbs,
13+
database: await sdk
14+
.forProject(params.region, params.project)
15+
.databases.get(params.database)
16+
};
2217
};

src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+layout.ts

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,26 @@ import { Dependencies } from '$lib/constants';
33
import type { LayoutLoad } from './$types';
44
import Breadcrumbs from './breadcrumbs.svelte';
55
import Header from './header.svelte';
6-
import { error } from '@sveltejs/kit';
76
import SubNavigation from './subNavigation.svelte';
87
import { Query } from '@appwrite.io/console';
98

109
export const load: LayoutLoad = async ({ params, depends }) => {
1110
depends(Dependencies.COLLECTION);
12-
try {
13-
const [collection, allCollections] = await Promise.all([
14-
sdk
15-
.forProject(params.region, params.project)
16-
.databases.getCollection(params.database, params.collection),
17-
sdk
18-
.forProject(params.region, params.project)
19-
.databases.listCollections(params.database, [Query.orderDesc(''), Query.limit(100)])
20-
]);
2111

22-
return {
23-
header: Header,
24-
breadcrumbs: Breadcrumbs,
25-
subNavigation: SubNavigation,
26-
collection,
27-
allCollections
28-
};
29-
} catch (e) {
30-
error(e.code, e.message);
31-
}
12+
const [collection, allCollections] = await Promise.all([
13+
sdk
14+
.forProject(params.region, params.project)
15+
.databases.getCollection(params.database, params.collection),
16+
sdk
17+
.forProject(params.region, params.project)
18+
.databases.listCollections(params.database, [Query.orderDesc(''), Query.limit(100)])
19+
]);
20+
21+
return {
22+
header: Header,
23+
breadcrumbs: Breadcrumbs,
24+
subNavigation: SubNavigation,
25+
collection,
26+
allCollections
27+
};
3228
};

0 commit comments

Comments
 (0)