Implement custom roles and improve permissions logic

The commit refactors the handling of account roles and enhances permissions checks. The account role has been shifted to use a string type, providing the ability to define custom roles. It also introduces the RolesDataProvider component, which stipulates role-related data for different forms and tables. The modification goes further to consider user role hierarchy in permissions checks, offering a more granular access control.
This commit is contained in:
giancarlo
2024-03-29 14:48:45 +08:00
parent f1967a686c
commit 99db8f4ca4
41 changed files with 498 additions and 228 deletions

View File

@@ -2,14 +2,13 @@
import Link from 'next/link';
import { Session, User } from '@supabase/supabase-js';
import type { User } from '@supabase/supabase-js';
import { ChevronRight } from 'lucide-react';
import { PersonalAccountDropdown } from '@kit/accounts/personal-account-dropdown';
import { useSignOut } from '@kit/supabase/hooks/use-sign-out';
import { useUser } from '@kit/supabase/hooks/use-user';
import { useUserSession } from '@kit/supabase/hooks/use-user-session';
import { Button } from '@kit/ui/button';
import { If } from '@kit/ui/if';
import { Trans } from '@kit/ui/trans';

View File

@@ -23,7 +23,7 @@ export async function generateMetadata({
const { title, date, description, image, slug } = post;
const url = [appConfig.url, 'blog', slug].join('/');
return {
return Promise.resolve({
title,
description,
openGraph: {
@@ -46,7 +46,7 @@ export async function generateMetadata({
description,
images: image ? [image] : [],
},
};
});
}
function BlogPost({ params }: { params: { slug: string } }) {

View File

@@ -25,6 +25,7 @@ export const buildDocumentationTree = cache(
.filter(
(_) =>
_.pathSegments.length === level + 1 &&
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
_.pathSegments
.map(({ pathName }: { pathName: string }) => pathName)
.join('/')
@@ -37,6 +38,7 @@ export const buildDocumentationTree = cache(
return pages.map((doc, index) => {
const children = buildDocumentationTree(
docs,
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
doc.pathSegments.map(({ pathName }: { pathName: string }) => pathName),
);
@@ -44,7 +46,7 @@ export const buildDocumentationTree = cache(
...doc,
pathSegments: doc.pathSegments || ([] as string[]),
collapsible: children.length > 0,
nextPage: children[0] || pages[index + 1],
nextPage: children[0] ?? pages[index + 1],
previousPage: pages[index - 1],
children,
};

View File

@@ -1,4 +1,3 @@
import type { DocumentationPage } from 'contentlayer/generated';
import { allDocumentationPages } from 'contentlayer/generated';
import DocsNavigation from '~/(marketing)/docs/_components/docs-navigation';