Fixed creation of users + better frontend handling of permissions

This commit is contained in:
cdricms
2025-03-06 17:34:52 +01:00
parent 3c6038bce1
commit 7cb633b4c6
46 changed files with 1511 additions and 909 deletions

View File

@@ -48,9 +48,9 @@ export default function BlogTable({ user }: { user: IUser }) {
const { replace } = useRouter();
const canUpdate = hasPermissions(user.roles, { blogs: ["update"] });
const canInsert = hasPermissions(user.roles, { blogs: ["insert"] });
const canDelete = hasPermissions(user.roles, { blogs: ["delete"] });
const { blogs: blogsPerm } = hasPermissions(user.roles, {
blogs: ["update", "insert", "delete"],
} as const);
const updateSearchParam = useCallback(
(key: string, value?: string) => {
@@ -136,7 +136,7 @@ export default function BlogTable({ user }: { user: IUser }) {
</Button>
)}
</div>
{canInsert && (
{blogsPerm.insert && (
<Button asChild>
<Link href="/dashboard/blogs/new">Nouvel article</Link>
</Button>
@@ -151,7 +151,7 @@ export default function BlogTable({ user }: { user: IUser }) {
<TableHead>Catégorie</TableHead>
<TableHead>Auteur</TableHead>
<TableHead>Publié</TableHead>
{(canUpdate || canDelete) && (
{(blogsPerm.update || blogsPerm.delete) && (
<TableHead className="w-[100px]">
Actions
</TableHead>
@@ -175,7 +175,7 @@ export default function BlogTable({ user }: { user: IUser }) {
"MMM d, yyyy",
)}
</TableCell>
{(canDelete || canUpdate) && (
{(blogsPerm.delete || blogsPerm.update) && (
<TableCell>
<DropdownMenu>
<DropdownMenuTrigger asChild>
@@ -190,7 +190,7 @@ export default function BlogTable({ user }: { user: IUser }) {
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{canUpdate && (
{blogsPerm.update && (
<DropdownMenuItem asChild>
<Link
href={`/dashboard/blogs/${blog.blogID}`}
@@ -201,7 +201,7 @@ export default function BlogTable({ user }: { user: IUser }) {
</Link>
</DropdownMenuItem>
)}
{canDelete && (
{blogsPerm.delete && (
<DropdownMenuItem
className="flex items-center text-destructive focus:text-destructive"
onClick={() =>

View File

@@ -0,0 +1,16 @@
"use client";
import { Loader2 } from "lucide-react";
import dynamic from "next/dynamic";
const BlogEditor = dynamic(
() => import("@/components/article/edit").then((mod) => mod.default),
{
ssr: false,
loading: () => <Loader2 className="animate-spin" />,
},
);
export default function NewBlog() {
return <BlogEditor />;
}

View File

@@ -1,16 +1,21 @@
"use client";
"use server";
import getMe from "@/lib/getMe";
import hasPermissions from "@/lib/hasPermissions";
import { redirect } from "next/navigation";
import NewBlog from "./_new";
import { Loader2 } from "lucide-react";
import dynamic from "next/dynamic";
export default async function Page() {
const me = await getMe();
if (
!me ||
me.status === "Error" ||
!me.data ||
!hasPermissions(me.data.roles, {
blogs: ["insert"],
} as const).all
) {
redirect("/dashboard");
}
const BlogEditor = dynamic(
() => import("@/components/article/edit").then((mod) => mod.default),
{
ssr: false,
loading: () => <Loader2 className="animate-spin" />,
},
);
export default function Page() {
return <BlogEditor />;
return <NewBlog />;
}

View File

@@ -11,8 +11,8 @@ export default async function Page() {
me.status === "Error" ||
!me.data ||
!hasPermissions(me.data.roles, {
blogs: ["get"],
})
blogs: ["get"] as const,
}).all
) {
redirect("/dashboard");
}