Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Migrate roles and permissions to MetaDB #7877

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 17 additions & 11 deletions packages/nc-gui/composables/useRoles/index.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
import { isString } from '@vue/shared'
import type { Roles, RolesObj, WorkspaceUserRoles } from 'nocodb-sdk'
import { extractRolesObj } from 'nocodb-sdk'
import type { Permission } from '#imports'
import { computed, createSharedComposable, rolePermissions, useApi, useGlobal } from '#imports'

const hasPermission = (role: Exclude<Roles, WorkspaceUserRoles>, hasRole: boolean, permission: Permission | string) => {
const rolePermission = rolePermissions[role]

const hasPermission = (
role: Exclude<Roles, WorkspaceUserRoles>,
hasRole: boolean,
permission: Permission | string,
rolePermission?: string[],
) => {
if (!hasRole || !rolePermission) return false

if (isString(rolePermission) && rolePermission === '*') return true

if ('include' in rolePermission && rolePermission.include) {
return !!rolePermission.include[permission as keyof typeof rolePermission.include]
}
if (rolePermission.includes('*')) return true

return rolePermission[permission as keyof typeof rolePermission]
return rolePermission.includes(permission as string)
}

/**
Expand Down Expand Up @@ -90,6 +88,7 @@ export const useRoles = createSharedComposable(() => {
...user.value,
roles: res.roles,
base_roles: res.base_roles,
role_permissions: res.role_permissions,
} as typeof User
} else if (options?.isSharedErd) {
const res = await api.auth.me(
Expand All @@ -107,6 +106,7 @@ export const useRoles = createSharedComposable(() => {
...user.value,
roles: res.roles,
base_roles: res.base_roles,
role_permissions: res.role_permissions,
} as typeof User
} else if (baseId) {
const res = await api.auth.me({ base_id: baseId })
Expand All @@ -116,6 +116,7 @@ export const useRoles = createSharedComposable(() => {
roles: res.roles,
base_roles: res.base_roles,
display_name: res.display_name,
role_permissions: res.role_permissions,
} as typeof User
} else {
const res = await api.auth.me({})
Expand All @@ -125,6 +126,7 @@ export const useRoles = createSharedComposable(() => {
roles: res.roles,
base_roles: res.base_roles,
display_name: res.display_name,
role_permissions: res.role_permissions,
} as typeof User
}
}
Expand All @@ -133,6 +135,10 @@ export const useRoles = createSharedComposable(() => {
permission: Permission | string,
args: { roles?: string | Record<string, boolean> | string[] | null } = {},
) => {
if (!user.value?.role_permissions) {
return false
}

const { roles } = args

let checkRoles: Record<string, boolean> = {}
Expand All @@ -144,7 +150,7 @@ export const useRoles = createSharedComposable(() => {
}

return Object.entries(checkRoles).some(([role, hasRole]) =>
hasPermission(role as Exclude<Roles, WorkspaceUserRoles>, hasRole, permission),
hasPermission(role as Exclude<Roles, WorkspaceUserRoles>, hasRole, permission, user.value?.role_permissions[role]),
)
}

Expand Down
1 change: 1 addition & 0 deletions packages/nc-gui/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ interface User {
roles: RolesObj
base_roles: RolesObj
workspace_roles: RolesObj
role_permissions: Record<string, string[]>
invite_token?: string
base_id?: string
display_name?: string | null
Expand Down