Files
NextChair/src/app/(owner)/layout.tsx
T
Stefan Lazic 3300045d9e Staff / Owner
Merged staff and owner settings
2026-08-05 16:35:52 +01:00

42 lines
1.5 KiB
TypeScript

import { redirect } from "next/navigation";
import { auth } from "@/auth";
import { StaffShell } from "@/components/navigation/staff-shell";
import { getNavRole, hasPermission } from "@/lib/auth/permissions";
import { Permission } from "@/generated/prisma/enums";
import { prisma } from "@/lib/db/prisma";
import { getNavItems } from "@/lib/navigation/nav-config";
import { getUnreadNotificationCount } from "@/services/notifications/notification.service";
/**
* Owner and Super Administrator are permissions, not separate account
* types (see docs/implementation-plan.md §3, §11) — this layout reuses the
* exact same shell/nav as (staff), and only adds a permission check on
* top. There is no "switch to owner tools" control anywhere in the app —
* a user who can manage staff simply sees "Manage" in their one merged
* nav (see lib/navigation/nav-config.ts).
*/
export default async function OwnerLayout({ children }: { children: React.ReactNode }) {
const session = await auth();
if (!session?.user) {
redirect("/sign-in?callbackUrl=/owner");
}
const canManageStaff = await hasPermission(session.user.id, Permission.MANAGE_STAFF);
if (!canManageStaff) {
redirect("/staff");
}
const role = (await getNavRole(session.user.id)) ?? "owner";
const unreadNotificationCount = await getUnreadNotificationCount(prisma, session.user.id);
return (
<StaffShell
items={getNavItems(role)}
notificationsHref="/owner/notifications"
unreadNotificationCount={unreadNotificationCount}
>
{children}
</StaffShell>
);
}