mirror of
https://github.com/supabase/supabase.git
synced 2026-06-13 01:39:53 +08:00
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com>
57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
|
|
|
import type { OrganizationMember } from '@/data/organizations/organization-members-query'
|
|
import { doPermissionsCheck, useGetPermissions } from '@/hooks/misc/useCheckPermissions'
|
|
import type { Permission, Role } from '@/types'
|
|
|
|
export const useGetRolesManagementPermissions = (
|
|
orgSlug?: string,
|
|
roles?: Role[],
|
|
permissions?: Permission[]
|
|
): { rolesAddable: Number[]; rolesRemovable: Number[] } => {
|
|
const { permissions: allPermissions, organizationSlug } = useGetPermissions(
|
|
permissions,
|
|
orgSlug,
|
|
permissions !== undefined && orgSlug !== undefined
|
|
)
|
|
|
|
const rolesAddable: Number[] = []
|
|
const rolesRemovable: Number[] = []
|
|
if (!roles || !orgSlug) return { rolesAddable, rolesRemovable }
|
|
|
|
roles.forEach((role: Role) => {
|
|
const canAdd = doPermissionsCheck(
|
|
allPermissions,
|
|
PermissionAction.CREATE,
|
|
'auth.subject_roles',
|
|
{
|
|
resource: { role_id: role.id },
|
|
},
|
|
organizationSlug
|
|
)
|
|
if (canAdd) rolesAddable.push(role.id)
|
|
|
|
const canRemove = doPermissionsCheck(
|
|
allPermissions,
|
|
PermissionAction.DELETE,
|
|
'auth.subject_roles',
|
|
{
|
|
resource: { role_id: role.id },
|
|
},
|
|
organizationSlug
|
|
)
|
|
if (canRemove) rolesRemovable.push(role.id)
|
|
})
|
|
|
|
return { rolesAddable, rolesRemovable }
|
|
}
|
|
|
|
export const hasMultipleOwners = (members: OrganizationMember[] = [], roles: Role[] = []) => {
|
|
const membersWhoAreOwners = members.filter((member) => {
|
|
const [memberRoleId] = member.role_ids ?? []
|
|
const role = roles.find((role: Role) => role.id === memberRoleId)
|
|
return role?.name === 'Owner' && !member.invited_at
|
|
})
|
|
return membersWhoAreOwners.length > 1
|
|
}
|