diff --git a/src/lib/stores/roles.ts b/src/lib/stores/roles.ts
index 587da2b74..0c0f55e38 100644
--- a/src/lib/stores/roles.ts
+++ b/src/lib/stores/roles.ts
@@ -40,4 +40,5 @@ export const canSeeBilling = derived(scopes, ($scopes) => $scopes.includes('bill
export const canSeeProjects = derived(scopes, ($scopes) => $scopes.includes('projects.read'));
export const canSeeDatabases = derived(scopes, ($scopes) => $scopes.includes('databases.read'));
export const canSeeFunctions = derived(scopes, ($scopes) => $scopes.includes('functions.read'));
-export const canSeeBuckets = derived(scopes, ($scopes) => $scopes.includes('projects.read'));
+export const canSeeBuckets = derived(scopes, ($scopes) => $scopes.includes('buckets.read'));
+export const canSeeMessages = derived(scopes, ($scopes) => $scopes.includes('messages.read'));
\ No newline at end of file
diff --git a/src/routes/(console)/+layout.svelte b/src/routes/(console)/+layout.svelte
index d0bb0ba18..df7840bcb 100644
--- a/src/routes/(console)/+layout.svelte
+++ b/src/routes/(console)/+layout.svelte
@@ -43,6 +43,7 @@
import { headerAlert } from '$lib/stores/headerAlert';
import { UsageRates } from '$lib/components/billing';
import { base } from '$app/paths';
+ import { canSeeProjects } from '$lib/stores/roles';
function kebabToSentenceCase(str: string) {
return str
@@ -66,9 +67,10 @@
keys: ['g', 'p'],
group: 'navigation',
disabled:
- $page.url.pathname.includes('/console/organization-') &&
- !$page.url.pathname.endsWith('/members') &&
- !$page.url.pathname.endsWith('/settings'),
+ ($page.url.pathname.includes('/console/organization-') &&
+ !$page.url.pathname.endsWith('/members') &&
+ !$page.url.pathname.endsWith('/settings')) ||
+ !$canSeeProjects,
rank: -1
},
{
diff --git a/src/routes/(console)/organization-[organization]/+layout.svelte b/src/routes/(console)/organization-[organization]/+layout.svelte
index a6d00c4d5..3f71e24ab 100644
--- a/src/routes/(console)/organization-[organization]/+layout.svelte
+++ b/src/routes/(console)/organization-[organization]/+layout.svelte
@@ -8,6 +8,7 @@
import { requestedMigration } from '$routes/store';
import { openMigrationWizard } from '../(migration-wizard)';
import { base } from '$app/paths';
+ import { isOwner } from '$lib/stores/roles';
export let data;
@@ -22,7 +23,7 @@
goto(`${base}/organization-${data.organization.$id}/members`);
},
keys: ['g', 'm'],
- disabled: $page.url.pathname.endsWith('/members'),
+ disabled: $page.url.pathname.endsWith('/members') || !$isOwner,
group: 'navigation'
},
{
@@ -31,7 +32,7 @@
goto(`${base}/organization-${data.organization.$id}/settings`);
},
keys: ['g', 's'],
- disabled: $page.url.pathname.endsWith('/settings'),
+ disabled: $page.url.pathname.endsWith('/settings') || !$isOwner,
group: 'navigation'
}
]);
diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte
index a769ff53b..f5ea4f665 100644
--- a/src/routes/(console)/organization-[organization]/+page.svelte
+++ b/src/routes/(console)/organization-[organization]/+page.svelte
@@ -90,7 +90,7 @@
showCreate = true;
},
keys: ['c'],
- disabled: $readOnly && !GRACE_PERIOD_OVERRIDE,
+ disabled: ($readOnly && !GRACE_PERIOD_OVERRIDE) || !$canWriteProjects,
group: 'projects',
icon: 'plus'
}
diff --git a/src/routes/(console)/project-[project]/+layout.svelte b/src/routes/(console)/project-[project]/+layout.svelte
index a168e58f3..f5ad5de36 100644
--- a/src/routes/(console)/project-[project]/+layout.svelte
+++ b/src/routes/(console)/project-[project]/+layout.svelte
@@ -17,6 +17,7 @@
import { MigrationBox } from '$lib/components';
import { page } from '$app/stores';
import { base } from '$app/paths';
+ import { canSeeBuckets, canSeeDatabases, canSeeFunctions, canSeeMessages, canWriteProjects } from '$lib/stores/roles';
onMount(() => {
return sdk.forConsole.client.subscribe(['project', 'console'], (response) => {
@@ -43,7 +44,8 @@
goto(`${base}/project-${$project.$id}/databases`);
},
keys: ['g', 'd'],
- group: 'navigation'
+ group: 'navigation',
+ disabled: !$canSeeDatabases
},
{
label: 'Go to Functions',
@@ -51,7 +53,8 @@
goto(`${base}/project-${$project.$id}/functions`);
},
keys: ['g', 'f'],
- group: 'navigation'
+ group: 'navigation',
+ disabled: !$canSeeFunctions
},
{
label: 'Go to Messaging',
@@ -59,7 +62,7 @@
goto(`${base}/project-${$project.$id}/messaging`);
},
keys: ['g', 'm'],
- disabled: $page.url.pathname.endsWith('messaging'),
+ disabled: $page.url.pathname.endsWith('messaging') || !$canSeeMessages,
group: 'navigation'
},
{
@@ -68,7 +71,8 @@
goto(`${base}/project-${$project.$id}/storage`);
},
keys: ['g', 's'],
- group: 'navigation'
+ group: 'navigation',
+ disabled: !$canSeeBuckets
},
{
label: 'Go to Settings',
@@ -76,7 +80,8 @@
goto(`${base}/project-${$project.$id}/settings`);
},
keys: ['g', 'e'],
- group: 'navigation'
+ group: 'navigation',
+ disabled: !$canWriteProjects
},
{
label: 'Go to Overview',
diff --git a/src/routes/(console)/project-[project]/auth/+layout.svelte b/src/routes/(console)/project-[project]/auth/+layout.svelte
index e94b0ea51..915225055 100644
--- a/src/routes/(console)/project-[project]/auth/+layout.svelte
+++ b/src/routes/(console)/project-[project]/auth/+layout.svelte
@@ -5,6 +5,7 @@
import { addSubPanel, registerCommands, updateCommandGroupRanks } from '$lib/commandCenter';
import { TeamsPanel, UsersPanel } from '$lib/commandCenter/panels';
import { readOnly } from '$lib/stores/billing';
+ import { canWriteTeams, canWriteUsers } from '$lib/stores/roles';
import { GRACE_PERIOD_OVERRIDE } from '$lib/system';
import { project } from '../store';
import { showCreateUser } from './+page.svelte';
@@ -23,7 +24,7 @@
group: 'users',
icon: 'plus',
rank: $page.url.pathname.endsWith('auth') ? 10 : 0,
- disabled: $readOnly && !GRACE_PERIOD_OVERRIDE
+ disabled: ($readOnly && !GRACE_PERIOD_OVERRIDE) || !$canWriteUsers
},
{
label: 'Create team',
@@ -38,7 +39,7 @@
group: 'teams',
icon: 'plus',
rank: $page.url.pathname.endsWith('teams') ? 10 : 0,
- disabled: $readOnly && !GRACE_PERIOD_OVERRIDE
+ disabled: ($readOnly && !GRACE_PERIOD_OVERRIDE) || !$canWriteTeams
},
{
label: 'Go to teams',
@@ -68,7 +69,7 @@
},
group: 'navigation',
rank: 1,
- disabled: $page.url.pathname.endsWith('security')
+ disabled: $page.url.pathname.endsWith('security') || !$canWriteUsers
},
{
label: 'Go to settings',
@@ -78,7 +79,7 @@
},
group: 'navigation',
rank: 1,
- disabled: $page.url.pathname.endsWith('settings')
+ disabled: $page.url.pathname.endsWith('settings') || !$canWriteUsers
},
{
label: 'Find users',
diff --git a/src/routes/(console)/project-[project]/databases/+page.svelte b/src/routes/(console)/project-[project]/databases/+page.svelte
index 08e41e6ab..9f8faa535 100644
--- a/src/routes/(console)/project-[project]/databases/+page.svelte
+++ b/src/routes/(console)/project-[project]/databases/+page.svelte
@@ -34,7 +34,7 @@
showCreate = true;
},
keys: ['c'],
- disabled: showCreate || isCreationDisabled,
+ disabled: showCreate || isCreationDisabled || !$canWriteDatabases,
icon: 'plus',
group: 'databases',
rank: 10
diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/+layout.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/+layout.svelte
index fbfa94777..548cdb5ba 100644
--- a/src/routes/(console)/project-[project]/databases/database-[database]/+layout.svelte
+++ b/src/routes/(console)/project-[project]/databases/database-[database]/+layout.svelte
@@ -14,6 +14,7 @@
import CreateCollection from './createCollection.svelte';
import { showCreate } from './store';
import { CollectionsPanel } from '$lib/commandCenter/panels';
+ import { canWriteCollections, canWriteDatabases } from '$lib/stores/roles';
const project = $page.params.project;
const databaseId = $page.params.database;
@@ -36,7 +37,7 @@
}
},
keys: $page.url.pathname.endsWith(databaseId) ? ['c'] : ['c', 'c'],
- disabled: $page.url.pathname.includes('collection-'),
+ disabled: $page.url.pathname.includes('collection-') || !$canWriteCollections,
group: 'collections',
icon: 'plus'
},
@@ -68,7 +69,7 @@
},
disabled:
$page.url.pathname.includes('/settings') ||
- $page.url.pathname.includes('collection-'),
+ $page.url.pathname.includes('collection-') || !$canWriteDatabases,
keys: ['g', 's'],
group: 'collections'
},
diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte
index 09497939b..7242395dc 100644
--- a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte
+++ b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte
@@ -32,6 +32,7 @@
import { wizard } from '$lib/stores/wizard';
import CreateDocument from './createDocument.svelte';
import { base } from '$app/paths';
+ import { canWriteCollections } from '$lib/stores/roles';
let unsubscribe: { (): void };
@@ -69,7 +70,8 @@
addSubPanel(CreateAttributePanel);
},
icon: 'plus',
- group: 'attributes'
+ group: 'attributes',
+ disabled: !$canWriteCollections
},
{
label: 'Go to documents',
@@ -134,7 +136,7 @@
`${base}/project-${$project?.$id}/databases/database-${$database?.$id}/collection-${$collection?.$id}/settings`
);
},
- disabled: $page.url.pathname.endsWith('settings'),
+ disabled: $page.url.pathname.endsWith('settings') || !$canWriteCollections,
group: 'collections'
},
{
@@ -147,7 +149,7 @@
group: 'collections',
disabled:
$page.url.pathname.endsWith('display-name') ||
- $page.url.pathname.endsWith('settings'),
+ $page.url.pathname.endsWith('settings') || !$canWriteCollections,
icon: 'eye'
},
{
@@ -160,7 +162,7 @@
group: 'collections',
disabled:
$page.url.pathname.endsWith('permissions') ||
- $page.url.pathname.endsWith('settings'),
+ $page.url.pathname.endsWith('settings') || !$canWriteCollections,
icon: 'puzzle'
},
{
@@ -173,7 +175,7 @@
group: 'collections',
disabled:
$page.url.pathname.endsWith('document-security') ||
- $page.url.pathname.endsWith('settings'),
+ $page.url.pathname.endsWith('settings') || !$canWriteCollections,
icon: 'lock-closed'
},
{
@@ -183,7 +185,8 @@
initCreateIndex();
},
icon: 'plus',
- group: 'indexes'
+ group: 'indexes',
+ disabled: !$canWriteCollections
}
]);
diff --git a/src/routes/(console)/project-[project]/functions/+layout.svelte b/src/routes/(console)/project-[project]/functions/+layout.svelte
index c98134a67..e6ee17f4e 100644
--- a/src/routes/(console)/project-[project]/functions/+layout.svelte
+++ b/src/routes/(console)/project-[project]/functions/+layout.svelte
@@ -1,6 +1,7 @@
diff --git a/src/routes/(console)/project-[project]/functions/+page.svelte b/src/routes/(console)/project-[project]/functions/+page.svelte
index ae0fcdc98..ee8dd22ac 100644
--- a/src/routes/(console)/project-[project]/functions/+page.svelte
+++ b/src/routes/(console)/project-[project]/functions/+page.svelte
@@ -74,9 +74,9 @@
keys: ['c'],
disabled:
$wizard.show ||
- isServiceLimited('functions', $organization?.billingPlan, $functionsList?.total),
+ isServiceLimited('functions', $organization?.billingPlan, $functionsList?.total) || !$canWriteFunctions,
icon: 'plus',
- group: 'functions'
+ group: 'functions',
}
]);
diff --git a/src/routes/(console)/project-[project]/functions/function-[function]/+layout.svelte b/src/routes/(console)/project-[project]/functions/function-[function]/+layout.svelte
index e8224a3b5..922bb922c 100644
--- a/src/routes/(console)/project-[project]/functions/function-[function]/+layout.svelte
+++ b/src/routes/(console)/project-[project]/functions/function-[function]/+layout.svelte
@@ -9,6 +9,7 @@
import { project } from '../../store';
import type { Models } from '@appwrite.io/console';
import { base } from '$app/paths';
+ import { canWriteFunctions } from '$lib/stores/roles';
onMount(() => {
let previousStatus = null;
@@ -47,7 +48,8 @@
},
keys: $page.url.pathname.endsWith($func.$id) ? ['c'] : ['c', 'd'],
group: 'functions',
- icon: 'plus'
+ icon: 'plus',
+ disabled: !$canWriteFunctions
},
{
label: 'Permissions',
@@ -58,7 +60,8 @@
scrollBy({ top: -100 });
},
icon: 'search',
- group: 'functions'
+ group: 'functions',
+ disabled: !$canWriteFunctions
},
{
label: 'Events',
@@ -69,7 +72,8 @@
scrollBy({ top: -100 });
},
icon: 'calendar',
- group: 'functions'
+ group: 'functions',
+ disabled: !$canWriteFunctions
},
{
label: 'Variables',
@@ -79,7 +83,8 @@
);
},
icon: 'list',
- group: 'functions'
+ group: 'functions',
+ disabled: !$canWriteFunctions
},
{
label: 'Timeout',
@@ -89,7 +94,8 @@
);
},
icon: 'x-circle',
- group: 'functions'
+ group: 'functions',
+ disabled: !$canWriteFunctions
},
{
label: 'Schedule',
@@ -100,7 +106,8 @@
scrollBy({ top: -100 });
},
icon: 'clock',
- group: 'functions'
+ group: 'functions',
+ disabled: !$canWriteFunctions
},
{
label: 'Go to deployments',
@@ -140,7 +147,7 @@
keys: ['g', 's'],
group: 'navigation',
rank: 10,
- disabled: $page.url.pathname.endsWith('settings')
+ disabled: $page.url.pathname.endsWith('settings') || !$canWriteFunctions
}
]);
diff --git a/src/routes/(console)/project-[project]/messaging/+layout.svelte b/src/routes/(console)/project-[project]/messaging/+layout.svelte
index 5775b672a..50ee249dc 100644
--- a/src/routes/(console)/project-[project]/messaging/+layout.svelte
+++ b/src/routes/(console)/project-[project]/messaging/+layout.svelte
@@ -12,6 +12,7 @@
import { messagesSearcher } from '$lib/commandCenter/searchers/messages';
import { providersSearcher } from '$lib/commandCenter/searchers/providers';
import { topicsSearcher } from '$lib/commandCenter/searchers/topics';
+ import { canWriteMessages } from '$lib/stores/roles';
import { project } from '../store';
// TODO: finalize the commands
@@ -23,7 +24,8 @@
addSubPanel(CreateMessagePanel);
},
icon: 'plus',
- group: 'messaging'
+ group: 'messaging',
+ disabled: !$canWriteMessages
},
{
label: 'Go to Topics',
diff --git a/src/routes/(console)/project-[project]/overview/+layout.svelte b/src/routes/(console)/project-[project]/overview/+layout.svelte
index 93d349b54..b837160d9 100644
--- a/src/routes/(console)/project-[project]/overview/+layout.svelte
+++ b/src/routes/(console)/project-[project]/overview/+layout.svelte
@@ -26,6 +26,7 @@
import { total } from '$lib/helpers/array';
import type { Metric } from '$lib/sdk/usage';
import { periodToDates } from '$lib/layout/usage.svelte';
+ import { canWriteProjects } from '$lib/stores/roles';
$: projectId = $page.params.project;
$: path = `${base}/project-${projectId}/overview`;
@@ -56,7 +57,8 @@
addSubPanel(PlatformsPanel);
},
icon: 'plus',
- group: 'integrations'
+ group: 'integrations',
+ disabled: !$canWriteProjects
},
{
label: 'Create API Key',
@@ -65,7 +67,8 @@
createApiKey();
},
keys: ['c', 'k'],
- group: 'integrations'
+ group: 'integrations',
+ disabled: !$canWriteProjects
}
]);
diff --git a/src/routes/(console)/project-[project]/settings/+layout.svelte b/src/routes/(console)/project-[project]/settings/+layout.svelte
index c766f9c7b..da22182b3 100644
--- a/src/routes/(console)/project-[project]/settings/+layout.svelte
+++ b/src/routes/(console)/project-[project]/settings/+layout.svelte
@@ -1,6 +1,7 @@