-
Notifications
You must be signed in to change notification settings - Fork 12
/
permissions.ts
96 lines (87 loc) · 2.83 KB
/
permissions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/**
* This enum should be exactly the same as the role_permissions type declared
* in `db/init/020_roles.sql`.
*
* Keep them in sync.
*
* TODO: at some point rename both to "Permissions".
**/
export enum DbRolePermissions {
all = "all",
edit_board_details = "edit_board_details",
post_as_role = "post_as_role",
edit_category_tags = "edit_category_tags",
edit_content_notices = "edit_content_notices",
move_thread = "move_thread",
edit_content = "edit_content",
edit_whisper_tags = "edit_whisper_tags",
edit_index_tags = "edit_index_tags",
edit_default_view = "edit_default_view",
}
export interface UserBoardPermissions {
board_permissions: BoardPermissions[];
post_permissions: PostPermissions[];
thread_permissions: ThreadPermissions[];
}
export enum ThreadPermissions {
editDefaultView = DbRolePermissions["edit_default_view"],
moveThread = DbRolePermissions["move_thread"],
}
export enum BoardPermissions {
editMetadata = DbRolePermissions["edit_board_details"],
}
export enum PostPermissions {
editContent = DbRolePermissions["edit_content"],
editWhisperTags = DbRolePermissions["edit_whisper_tags"],
editCategoryTags = DbRolePermissions["edit_category_tags"],
editIndexTags = DbRolePermissions["edit_index_tags"],
editContentNotices = DbRolePermissions["edit_content_notices"],
}
export const extractPermissions = <T>(
targetEnum: T,
permissions: string[]
): T[keyof T][] => {
const extractedPermissions = [] as T[keyof T][];
permissions.forEach((permission) => {
// Check in the target enum for the key that has the permission
// string as the value.
const foundPermission = Object.entries(targetEnum).find(
([_, value]) => value === permission
);
if (foundPermission) {
extractedPermissions.push(foundPermission[1] as T[keyof T]);
}
});
return extractedPermissions;
};
/**
* The set of post permissions associated with every post owner.
*/
export const POST_OWNER_PERMISSIONS = [
PostPermissions.editCategoryTags,
PostPermissions.editContentNotices,
PostPermissions.editIndexTags,
PostPermissions.editWhisperTags,
];
/**
* The set of thread permissions associated with every thread owner.
*/
export const THREAD_OWNER_PERMISSIONS = [ThreadPermissions.editDefaultView];
export enum BoardRestrictions {
LOCK_ACCESS = "lock_access",
DELIST = "delist",
}
export const extractBoardRestrictions = (restrictions: string[]) => {
const extractedRestrictions = [] as BoardRestrictions[];
restrictions.forEach((restriction) => {
// Check in the target enum for the key that has the permission
// string as the value.
const foundRestriction = Object.entries(BoardRestrictions).find(
([_, value]) => value === restriction
);
if (foundRestriction) {
extractedRestrictions.push(foundRestriction[1]);
}
});
return extractedRestrictions;
};