Skip to content
File

Blob: src/shared/entitlements/page-structure.ts

typescript76 lines
1import type { ResolvedWorkspaceRole } from "@/shared/entitlements/common";
2 
3export interface PageStructureEntitlements {
4 createPage: boolean;
5 movePage: boolean;
6 archivePage: boolean;
7 archiveAnyPage: boolean;
8 archiveOwnPage: boolean;
9}
10 
11const PAGE_STRUCTURE_ROLE_TABLE: Record<
12 ResolvedWorkspaceRole,
13 { createPage: boolean; movePage: boolean; archiveOwnPage: boolean; archiveAnyPage: boolean }
14> = {
15 owner: {
16 createPage: true,
17 movePage: true,
18 archiveOwnPage: true,
19 archiveAnyPage: true,
20 },
21 admin: {
22 createPage: true,
23 movePage: true,
24 archiveOwnPage: true,
25 archiveAnyPage: true,
26 },
27 member: {
28 createPage: true,
29 movePage: true,
30 archiveOwnPage: true,
31 archiveAnyPage: false,
32 },
33 guest: {
34 createPage: false,
35 movePage: false,
36 // Guests cannot create their own pages, so they also cannot archive one.
37 // The worker delete route and the client sidebar/archive affordances all
38 // derive from this table, so flipping this here propagates everywhere.
39 archiveOwnPage: false,
40 archiveAnyPage: false,
41 },
42 none: {
43 createPage: false,
44 movePage: false,
45 archiveOwnPage: false,
46 archiveAnyPage: false,
47 },
48};
49 
50export function getPageStructureEntitlements(
51 workspaceRole: ResolvedWorkspaceRole,
52 ownsPage: boolean,
53): PageStructureEntitlements {
54 const roleEntitlements = PAGE_STRUCTURE_ROLE_TABLE[workspaceRole];
55 
56 return {
57 createPage: roleEntitlements.createPage,
58 movePage: roleEntitlements.movePage,
59 archivePage: roleEntitlements.archiveAnyPage || (roleEntitlements.archiveOwnPage && ownsPage),
60 archiveAnyPage: roleEntitlements.archiveAnyPage,
61 archiveOwnPage: roleEntitlements.archiveOwnPage,
62 };
63}
64 
65export function canCreatePageInWorkspace(workspaceRole: ResolvedWorkspaceRole): boolean {
66 return PAGE_STRUCTURE_ROLE_TABLE[workspaceRole].createPage;
67}
68 
69export function canMovePagesInWorkspace(workspaceRole: ResolvedWorkspaceRole): boolean {
70 return PAGE_STRUCTURE_ROLE_TABLE[workspaceRole].movePage;
71}
72 
73export function canArchivePageInWorkspace(workspaceRole: ResolvedWorkspaceRole, ownsPage: boolean): boolean {
74 return getPageStructureEntitlements(workspaceRole, ownsPage).archivePage;
75}