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 @@