1012 lines
33 KiB
TypeScript
1012 lines
33 KiB
TypeScript
/**
|
||
* Permission universe — the single source of truth for every permission
|
||
* recognized by the dynamic RBAC system.
|
||
*
|
||
* Permissions are hardcoded here in application code. The Payload admin panel
|
||
* reads this list when rendering the permission selector on the `roles`
|
||
* collection. Roles are dynamic (created/edited in the admin panel), but the
|
||
* set of assignable permissions is NOT — it can only grow by adding entries
|
||
* here.
|
||
*
|
||
* Format: `{collection-slug}:{create|read|update|delete}` for collection CRUD,
|
||
* plus domain-specific special permissions for feature areas that don't map
|
||
* cleanly to CRUD (e.g. `logistics:manage`, `discord:announce`).
|
||
*/
|
||
|
||
export interface PermissionOption {
|
||
/** Machine-readable key, e.g. `"users:create"`. */
|
||
value: string;
|
||
/** Human-readable label, e.g. `"Create"`. */
|
||
label: string | string[];
|
||
}
|
||
|
||
export interface PermissionGroup {
|
||
/** Group label shown as a header in the admin UI, e.g. `"Users"`. */
|
||
group: string;
|
||
/** Permissions within this group. */
|
||
permissions: PermissionOption[];
|
||
}
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// Permission groups
|
||
// ---------------------------------------------------------------------------
|
||
|
||
export const PERMISSION_GROUPS: PermissionGroup[] = [
|
||
{
|
||
group: "System",
|
||
permissions: [{ value: "system:admin-access", label: "Superuser Tier (user management, notification oversight, final approval states)" }],
|
||
},
|
||
|
||
// ---- Media ---------------------------------------------------------------
|
||
{
|
||
group: "Media",
|
||
permissions: [
|
||
{ value: "media:create", label: "Create" },
|
||
{ value: "media:read", label: "Read" },
|
||
{ value: "media:update", label: "Update" },
|
||
{ value: "media:delete", label: "Delete" },
|
||
{ value: "admin:media:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Users ---------------------------------------------------------------
|
||
{
|
||
group: "Users",
|
||
permissions: [
|
||
{ value: "users:create", label: "Create Users" },
|
||
{ value: "users:read", label: "Read Users" },
|
||
{ value: "users:update", label: "Update Users" },
|
||
{ value: "users:delete", label: "Delete Users" },
|
||
{ value: "users:unlock", label: "Unlock User Accounts" },
|
||
{ value: "users:assign-roles", label: "Assign Roles to Users" },
|
||
{ value: "admin:users:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Roles",
|
||
permissions: [
|
||
{ value: "roles:create", label: "Create" },
|
||
{ value: "roles:read", label: "Read" },
|
||
{ value: "roles:update", label: "Update" },
|
||
{ value: "roles:delete", label: "Delete" },
|
||
{ value: "admin:roles:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Ranks",
|
||
permissions: [
|
||
{ value: "ranks:create", label: "Create" },
|
||
{ value: "ranks:read", label: "Read" },
|
||
{ value: "ranks:update", label: "Update" },
|
||
{ value: "ranks:delete", label: "Delete" },
|
||
{ value: "admin:ranks:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Profiles",
|
||
permissions: [
|
||
{ value: "profiles:create", label: "Create" },
|
||
{ value: "profiles:read", label: "Read" },
|
||
{ value: "profiles:update", label: "Update" },
|
||
{ value: "profiles:delete", label: "Delete" },
|
||
{ value: "admin:profiles:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Awards",
|
||
permissions: [
|
||
{ value: "awards:create", label: "Create" },
|
||
{ value: "awards:read", label: "Read" },
|
||
{ value: "awards:update", label: "Update" },
|
||
{ value: "awards:delete", label: "Delete" },
|
||
{ value: "admin:awards:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Qualifications",
|
||
permissions: [
|
||
{ value: "qualifications:create", label: "Create" },
|
||
{ value: "qualifications:read", label: "Read" },
|
||
{ value: "qualifications:update", label: "Update" },
|
||
{ value: "qualifications:delete", label: "Delete" },
|
||
{ value: "admin:qualifications:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Assignments",
|
||
permissions: [
|
||
{ value: "assignments:create", label: "Create" },
|
||
{ value: "assignments:read", label: "Read" },
|
||
{ value: "assignments:update", label: "Update" },
|
||
{ value: "assignments:delete", label: "Delete" },
|
||
{ value: "admin:assignments:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Assignment Transfers",
|
||
permissions: [
|
||
{ value: "assignment-transfers:create", label: "Create" },
|
||
{ value: "assignment-transfers:read", label: "Read" },
|
||
{ value: "assignment-transfers:update", label: "Update" },
|
||
{ value: "assignment-transfers:delete", label: "Delete" },
|
||
{ value: "admin:assignment-transfers:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Experience",
|
||
permissions: [
|
||
{ value: "experience:create", label: "Create" },
|
||
{ value: "experience:read", label: "Read" },
|
||
{ value: "experience:update", label: "Update" },
|
||
{ value: "experience:delete", label: "Delete" },
|
||
{ value: "admin:experience:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "User Notifications",
|
||
permissions: [
|
||
{ value: "user-notifications:create", label: "Create" },
|
||
{ value: "user-notifications:read", label: "Read" },
|
||
{ value: "user-notifications:update", label: "Update" },
|
||
{ value: "user-notifications:delete", label: "Delete" },
|
||
{ value: "admin:user-notifications:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Evaluations",
|
||
permissions: [
|
||
{ value: "evaluations:create", label: "Create" },
|
||
{ value: "evaluations:read", label: "Read" },
|
||
{ value: "evaluations:update", label: "Update" },
|
||
{ value: "evaluations:delete", label: "Delete" },
|
||
{ value: "admin:evaluations:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Intelligence --------------------------------------------------------
|
||
{
|
||
group: "Missions",
|
||
permissions: [
|
||
{ value: "missions:create", label: "Create" },
|
||
{ value: "missions:read", label: "Read" },
|
||
{ value: "missions:update", label: "Update" },
|
||
{ value: "missions:delete", label: "Delete" },
|
||
{ value: "missions:read-sensitive", label: "Read Sensitive Fields (server passwords)" },
|
||
{ value: "admin:missions:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Mission Attendances",
|
||
permissions: [
|
||
{ value: "mission-attendances:create", label: "Create" },
|
||
{ value: "mission-attendances:read", label: "Read" },
|
||
{ value: "mission-attendances:update", label: "Update" },
|
||
{ value: "mission-attendances:delete", label: "Delete" },
|
||
{ value: "admin:mission-attendances:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Campaigns",
|
||
permissions: [
|
||
{ value: "campaigns:create", label: "Create" },
|
||
{ value: "campaigns:read", label: "Read" },
|
||
{ value: "campaigns:update", label: "Update" },
|
||
{ value: "campaigns:delete", label: "Delete" },
|
||
{ value: "admin:campaigns:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Campaigns",
|
||
permissions: [{ value: "campaigns:manage", label: "Manage Campaigns (owner bypass)" }],
|
||
},
|
||
{
|
||
group: "Factions",
|
||
permissions: [
|
||
{ value: "factions:create", label: "Create" },
|
||
{ value: "factions:read", label: "Read" },
|
||
{ value: "factions:update", label: "Update" },
|
||
{ value: "factions:delete", label: "Delete" },
|
||
{ value: "admin:factions:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Technologies",
|
||
permissions: [
|
||
{ value: "technologies:create", label: "Create" },
|
||
{ value: "technologies:read", label: "Read" },
|
||
{ value: "technologies:update", label: "Update" },
|
||
{ value: "technologies:delete", label: "Delete" },
|
||
{ value: "admin:technologies:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Logistics -----------------------------------------------------------
|
||
{
|
||
group: "Assets",
|
||
permissions: [
|
||
{ value: "assets:create", label: "Create" },
|
||
{ value: "assets:read", label: "Read" },
|
||
{ value: "assets:update", label: "Update" },
|
||
{ value: "assets:delete", label: "Delete" },
|
||
{ value: "admin:assets:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Resources",
|
||
permissions: [
|
||
{ value: "resources:create", label: "Create" },
|
||
{ value: "resources:read", label: "Read" },
|
||
{ value: "resources:update", label: "Update" },
|
||
{ value: "resources:delete", label: "Delete" },
|
||
{ value: "admin:resources:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Vehicles",
|
||
permissions: [
|
||
{ value: "vehicles:create", label: "Create" },
|
||
{ value: "vehicles:read", label: "Read" },
|
||
{ value: "vehicles:update", label: "Update" },
|
||
{ value: "vehicles:delete", label: "Delete" },
|
||
{ value: "admin:vehicles:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Structures",
|
||
permissions: [
|
||
{ value: "structures:create", label: "Create" },
|
||
{ value: "structures:read", label: "Read" },
|
||
{ value: "structures:update", label: "Update" },
|
||
{ value: "structures:delete", label: "Delete" },
|
||
{ value: "admin:structures:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Shipments",
|
||
permissions: [
|
||
{ value: "shipments:create", label: "Create" },
|
||
{ value: "shipments:read", label: "Read" },
|
||
{ value: "shipments:update", label: "Update" },
|
||
{ value: "shipments:delete", label: "Delete" },
|
||
{ value: "admin:shipments:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Banking -------------------------------------------------------------
|
||
{
|
||
group: "Bank Accounts",
|
||
permissions: [
|
||
{ value: "bank-accounts:create", label: "Create" },
|
||
{ value: "bank-accounts:read", label: "Read" },
|
||
{ value: "bank-accounts:update", label: "Update" },
|
||
{ value: "bank-accounts:delete", label: "Delete" },
|
||
{ value: "admin:bank-accounts:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Bank Transactions",
|
||
permissions: [
|
||
{ value: "bank-transactions:create", label: "Create" },
|
||
{ value: "bank-transactions:read", label: "Read" },
|
||
{ value: "bank-transactions:update", label: "Update" },
|
||
{ value: "bank-transactions:delete", label: "Delete" },
|
||
{ value: "admin:bank-transactions:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Ledger Entries",
|
||
permissions: [
|
||
{ value: "ledger-entries:create", label: "Create" },
|
||
{ value: "ledger-entries:read", label: "Read" },
|
||
{ value: "ledger-entries:update", label: "Update" },
|
||
{ value: "ledger-entries:delete", label: "Delete" },
|
||
{ value: "admin:ledger-entries:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Locker --------------------------------------------------------------
|
||
{
|
||
group: "Locker Storages",
|
||
permissions: [
|
||
{ value: "locker-storages:create", label: "Create" },
|
||
{ value: "locker-storages:read", label: "Read" },
|
||
{ value: "locker-storages:update", label: "Update" },
|
||
{ value: "locker-storages:delete", label: "Delete" },
|
||
{ value: "admin:locker-storages:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Loadouts",
|
||
permissions: [
|
||
{ value: "loadouts:create", label: "Create" },
|
||
{ value: "loadouts:read", label: "Read" },
|
||
{ value: "loadouts:update", label: "Update" },
|
||
{ value: "loadouts:delete", label: "Delete" },
|
||
{ value: "admin:loadouts:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Market --------------------------------------------------------------
|
||
{
|
||
group: "Market Listings",
|
||
permissions: [
|
||
{ value: "market-listings:create", label: "Create" },
|
||
{ value: "market-listings:read", label: "Read" },
|
||
{ value: "market-listings:update", label: "Update" },
|
||
{ value: "market-listings:delete", label: "Delete" },
|
||
{ value: "admin:market-listings:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Market Negotiations",
|
||
permissions: [
|
||
{ value: "market-negotiations:create", label: "Create" },
|
||
{ value: "market-negotiations:read", label: "Read" },
|
||
{ value: "market-negotiations:update", label: "Update" },
|
||
{ value: "market-negotiations:delete", label: "Delete" },
|
||
{ value: "admin:market-negotiations:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Market State",
|
||
permissions: [
|
||
{ value: "market-state:create", label: "Create" },
|
||
{ value: "market-state:read", label: "Read" },
|
||
{ value: "market-state:update", label: "Update" },
|
||
{ value: "market-state:delete", label: "Delete" },
|
||
{ value: "admin:market-state:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Helpdesk ------------------------------------------------------------
|
||
{
|
||
group: "Projects",
|
||
permissions: [
|
||
{ value: "projects:create", label: "Create" },
|
||
{ value: "projects:read", label: "Read" },
|
||
{ value: "projects:update", label: "Update" },
|
||
{ value: "projects:delete", label: "Delete" },
|
||
{ value: "admin:projects:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Labels",
|
||
permissions: [
|
||
{ value: "labels:create", label: "Create" },
|
||
{ value: "labels:read", label: "Read" },
|
||
{ value: "labels:update", label: "Update" },
|
||
{ value: "labels:delete", label: "Delete" },
|
||
{ value: "admin:labels:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Sprints",
|
||
permissions: [
|
||
{ value: "sprints:create", label: "Create" },
|
||
{ value: "sprints:read", label: "Read" },
|
||
{ value: "sprints:update", label: "Update" },
|
||
{ value: "sprints:delete", label: "Delete" },
|
||
{ value: "admin:sprints:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Releases",
|
||
permissions: [
|
||
{ value: "releases:create", label: "Create" },
|
||
{ value: "releases:read", label: "Read" },
|
||
{ value: "releases:update", label: "Update" },
|
||
{ value: "releases:delete", label: "Delete" },
|
||
{ value: "admin:releases:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Tickets",
|
||
permissions: [
|
||
{ value: "tickets:create", label: "Create" },
|
||
{ value: "tickets:read", label: "Read" },
|
||
{ value: "tickets:update", label: "Update" },
|
||
{ value: "tickets:delete", label: "Delete" },
|
||
{ value: "admin:tickets:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Ticket Votes",
|
||
permissions: [
|
||
{ value: "ticket-votes:create", label: "Create" },
|
||
{ value: "ticket-votes:read", label: "Read" },
|
||
{ value: "ticket-votes:update", label: "Update" },
|
||
{ value: "ticket-votes:delete", label: "Delete" },
|
||
{ value: "admin:ticket-votes:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Game ----------------------------------------------------------------
|
||
{
|
||
group: "Game Structures",
|
||
permissions: [
|
||
{ value: "game-structures:create", label: "Create" },
|
||
{ value: "game-structures:read", label: "Read" },
|
||
{ value: "game-structures:update", label: "Update" },
|
||
{ value: "game-structures:delete", label: "Delete" },
|
||
{ value: "admin:game-structures:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Game Vehicles",
|
||
permissions: [
|
||
{ value: "game-vehicles:create", label: "Create" },
|
||
{ value: "game-vehicles:read", label: "Read" },
|
||
{ value: "game-vehicles:update", label: "Update" },
|
||
{ value: "game-vehicles:delete", label: "Delete" },
|
||
{ value: "admin:game-vehicles:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Game NPCs",
|
||
permissions: [
|
||
{ value: "game-npcs:create", label: "Create" },
|
||
{ value: "game-npcs:read", label: "Read" },
|
||
{ value: "game-npcs:update", label: "Update" },
|
||
{ value: "game-npcs:delete", label: "Delete" },
|
||
{ value: "admin:game-npcs:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Game Hard Resources",
|
||
permissions: [
|
||
{ value: "game-hard-resources:create", label: "Create" },
|
||
{ value: "game-hard-resources:read", label: "Read" },
|
||
{ value: "game-hard-resources:update", label: "Update" },
|
||
{ value: "game-hard-resources:delete", label: "Delete" },
|
||
{ value: "admin:game-hard-resources:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Game Event Logs",
|
||
permissions: [
|
||
{ value: "game-event-logs:create", label: "Create" },
|
||
{ value: "game-event-logs:read", label: "Read" },
|
||
{ value: "game-event-logs:update", label: "Update" },
|
||
{ value: "game-event-logs:delete", label: "Delete" },
|
||
{ value: "admin:game-event-logs:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- World ---------------------------------------------------------------
|
||
{
|
||
group: "Maps",
|
||
permissions: [
|
||
{ value: "maps:create", label: "Create" },
|
||
{ value: "maps:read", label: "Read" },
|
||
{ value: "maps:update", label: "Update" },
|
||
{ value: "maps:delete", label: "Delete" },
|
||
{ value: "admin:maps:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Map Features",
|
||
permissions: [
|
||
{ value: "map-roads:read", label: "Read Roads" },
|
||
{ value: "admin:map-roads:manage", label: "Manage Roads Admin Page" },
|
||
{ value: "map-zones:read", label: "Read Zones" },
|
||
{ value: "admin:map-zones:manage", label: "Manage Zones Admin Page" },
|
||
{ value: "resource-nodes:read", label: "Read Resource Nodes" },
|
||
{ value: "admin:resource-nodes:manage", label: "Manage Resource Nodes Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Narrative Events",
|
||
permissions: [
|
||
{ value: "narrative-events:create", label: "Create" },
|
||
{ value: "narrative-events:read", label: "Read" },
|
||
{ value: "narrative-events:update", label: "Update" },
|
||
{ value: "narrative-events:delete", label: "Delete" },
|
||
{ value: "admin:narrative-events:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Server --------------------------------------------------------------
|
||
{
|
||
group: "Mission Files",
|
||
permissions: [
|
||
{ value: "mission-files:create", label: "Create" },
|
||
{ value: "mission-files:read", label: "Read" },
|
||
{ value: "mission-files:update", label: "Update" },
|
||
{ value: "mission-files:delete", label: "Delete" },
|
||
{ value: "admin:mission-files:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Mod Lists",
|
||
permissions: [
|
||
{ value: "mod-lists:create", label: "Create" },
|
||
{ value: "mod-lists:read", label: "Read" },
|
||
{ value: "mod-lists:update", label: "Update" },
|
||
{ value: "mod-lists:delete", label: "Delete" },
|
||
{ value: "admin:mod-lists:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Respawn Tickets",
|
||
permissions: [
|
||
{ value: "respawn-tickets:create", label: "Create" },
|
||
{ value: "respawn-tickets:read", label: "Read" },
|
||
{ value: "respawn-tickets:update", label: "Update" },
|
||
{ value: "respawn-tickets:delete", label: "Delete" },
|
||
{ value: "admin:respawn-tickets:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Game Servers",
|
||
permissions: [
|
||
{ value: "game-servers:create", label: "Create" },
|
||
{ value: "game-servers:read", label: "Read" },
|
||
{ value: "game-servers:update", label: "Update" },
|
||
{ value: "game-servers:delete", label: "Delete" },
|
||
{ value: "admin:game-servers:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Arma Sync Events",
|
||
permissions: [
|
||
{ value: "arma-sync-events:create", label: "Create" },
|
||
{ value: "arma-sync-events:read", label: "Read" },
|
||
{ value: "arma-sync-events:update", label: "Update" },
|
||
{ value: "arma-sync-events:delete", label: "Delete" },
|
||
{ value: "admin:arma-sync-events:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Arma Commands",
|
||
permissions: [
|
||
{ value: "arma-commands:create", label: "Create" },
|
||
{ value: "arma-commands:read", label: "Read" },
|
||
{ value: "arma-commands:update", label: "Update" },
|
||
{ value: "arma-commands:delete", label: "Delete" },
|
||
{ value: "admin:arma-commands:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Operation Events",
|
||
permissions: [
|
||
{ value: "operation-events:create", label: "Create" },
|
||
{ value: "operation-events:read", label: "Read" },
|
||
{ value: "operation-events:update", label: "Update" },
|
||
{ value: "operation-events:delete", label: "Delete" },
|
||
{ value: "admin:operation-events:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Operation Effects",
|
||
permissions: [
|
||
{ value: "operation-effects:create", label: "Create" },
|
||
{ value: "operation-effects:read", label: "Read" },
|
||
{ value: "operation-effects:update", label: "Update" },
|
||
{ value: "operation-effects:delete", label: "Delete" },
|
||
{ value: "admin:operation-effects:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Operation Reservations",
|
||
permissions: [
|
||
{ value: "operation-reservations:create", label: "Create" },
|
||
{ value: "operation-reservations:read", label: "Read" },
|
||
{ value: "operation-reservations:update", label: "Update" },
|
||
{ value: "operation-reservations:delete", label: "Delete" },
|
||
{ value: "admin:operation-reservations:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Operation Readiness",
|
||
permissions: [
|
||
{ value: "operation-readiness:create", label: "Create" },
|
||
{ value: "operation-readiness:read", label: "Read" },
|
||
{ value: "operation-readiness:update", label: "Update" },
|
||
{ value: "operation-readiness:delete", label: "Delete" },
|
||
{ value: "admin:operation-readiness:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
{
|
||
group: "Zone Pressure",
|
||
permissions: [
|
||
{ value: "zone-pressure:create", label: "Create" },
|
||
{ value: "zone-pressure:read", label: "Read" },
|
||
{ value: "zone-pressure:update", label: "Update" },
|
||
{ value: "zone-pressure:delete", label: "Delete" },
|
||
{ value: "admin:zone-pressure:manage", label: "Manage Admin Page" },
|
||
],
|
||
},
|
||
|
||
// ---- Globals -------------------------------------------------------------
|
||
{
|
||
group: "Game Rules (Global)",
|
||
permissions: [
|
||
{ value: "game-rules:read", label: "Read" },
|
||
{ value: "game-rules:update", label: "Update" },
|
||
],
|
||
},
|
||
{
|
||
group: "Shims (Global)",
|
||
permissions: [
|
||
{ value: "shims:read", label: "Read" },
|
||
{ value: "shims:update", label: "Update" },
|
||
],
|
||
},
|
||
|
||
// ---- Special / Feature-area ----------------------------------------------
|
||
{
|
||
group: "Logistics",
|
||
permissions: [{ value: "logistics:manage", label: "Manage Logistics (manager bypass)" }],
|
||
},
|
||
{
|
||
group: "Intelligence",
|
||
permissions: [
|
||
{ value: "intelligence:manage", label: "Manage Intelligence (manager bypass)" },
|
||
{ value: "profiles:intel_excerpt:update", label: ["Profile", "Intel Excerpt", "Update"] },
|
||
],
|
||
},
|
||
{
|
||
group: "Banking",
|
||
permissions: [{ value: "banking:manage", label: "Manage Banking (manager bypass)" }],
|
||
},
|
||
{
|
||
group: "Helpdesk",
|
||
permissions: [{ value: "tickets:staff", label: "Staff Helpdesk Tickets" }],
|
||
},
|
||
{
|
||
group: "Discord Bot",
|
||
permissions: [
|
||
{ value: "discord:staff", label: "Bot Staff (isStaff)" },
|
||
{ value: "discord:announce", label: "Post Announcements (/announce)" },
|
||
],
|
||
},
|
||
{
|
||
group: "Minigames",
|
||
permissions: [
|
||
{ value: "custom-minefields:update", label: "Edit Any Custom Minefield" },
|
||
{ value: "custom-minefields:delete", label: "Delete Custom Minefields" },
|
||
{ value: "custom-minefield-scores:delete", label: "Delete Custom Minefield Scores" },
|
||
{ value: "custom-radio-tests:update", label: "Edit Any Custom Radio Test" },
|
||
{ value: "custom-radio-tests:delete", label: "Delete Custom Radio Tests" },
|
||
{ value: "custom-radio-test-scores:delete", label: "Delete Custom Radio Test Scores" },
|
||
],
|
||
},
|
||
];
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// Derived exports
|
||
// ---------------------------------------------------------------------------
|
||
|
||
/** Flat array of all permission value strings, as a const tuple for type inference. */
|
||
export const ALL_PERMISSION_VALUES = PERMISSION_GROUPS.flatMap((g) =>
|
||
g.permissions.map((p) => p.value),
|
||
) as unknown as readonly [
|
||
"system:admin-access",
|
||
"media:create",
|
||
"media:read",
|
||
"media:update",
|
||
"media:delete",
|
||
"admin:media:manage",
|
||
"users:create",
|
||
"users:read",
|
||
"users:update",
|
||
"users:delete",
|
||
"users:unlock",
|
||
"users:assign-roles",
|
||
"admin:users:manage",
|
||
"roles:create",
|
||
"roles:read",
|
||
"roles:update",
|
||
"roles:delete",
|
||
"admin:roles:manage",
|
||
"ranks:create",
|
||
"ranks:read",
|
||
"ranks:update",
|
||
"ranks:delete",
|
||
"admin:ranks:manage",
|
||
"profiles:create",
|
||
"profiles:read",
|
||
"profiles:update",
|
||
"profiles:delete",
|
||
"admin:profiles:manage",
|
||
"awards:create",
|
||
"awards:read",
|
||
"awards:update",
|
||
"awards:delete",
|
||
"admin:awards:manage",
|
||
"qualifications:create",
|
||
"qualifications:read",
|
||
"qualifications:update",
|
||
"qualifications:delete",
|
||
"admin:qualifications:manage",
|
||
"assignments:create",
|
||
"assignments:read",
|
||
"assignments:update",
|
||
"assignments:delete",
|
||
"admin:assignments:manage",
|
||
"assignment-transfers:create",
|
||
"assignment-transfers:read",
|
||
"assignment-transfers:update",
|
||
"assignment-transfers:delete",
|
||
"admin:assignment-transfers:manage",
|
||
"experience:create",
|
||
"experience:read",
|
||
"experience:update",
|
||
"experience:delete",
|
||
"admin:experience:manage",
|
||
"user-notifications:create",
|
||
"user-notifications:read",
|
||
"user-notifications:update",
|
||
"user-notifications:delete",
|
||
"admin:user-notifications:manage",
|
||
"evaluations:create",
|
||
"evaluations:read",
|
||
"evaluations:update",
|
||
"evaluations:delete",
|
||
"admin:evaluations:manage",
|
||
"missions:create",
|
||
"missions:read",
|
||
"missions:update",
|
||
"missions:delete",
|
||
"missions:read-sensitive",
|
||
"admin:missions:manage",
|
||
"mission-attendances:create",
|
||
"mission-attendances:read",
|
||
"mission-attendances:update",
|
||
"mission-attendances:delete",
|
||
"admin:mission-attendances:manage",
|
||
"campaigns:create",
|
||
"campaigns:read",
|
||
"campaigns:update",
|
||
"campaigns:delete",
|
||
"admin:campaigns:manage",
|
||
"campaigns:manage",
|
||
"factions:create",
|
||
"factions:read",
|
||
"factions:update",
|
||
"factions:delete",
|
||
"admin:factions:manage",
|
||
"technologies:create",
|
||
"technologies:read",
|
||
"technologies:update",
|
||
"technologies:delete",
|
||
"admin:technologies:manage",
|
||
"assets:create",
|
||
"assets:read",
|
||
"assets:update",
|
||
"assets:delete",
|
||
"admin:assets:manage",
|
||
"resources:create",
|
||
"resources:read",
|
||
"resources:update",
|
||
"resources:delete",
|
||
"admin:resources:manage",
|
||
"vehicles:create",
|
||
"vehicles:read",
|
||
"vehicles:update",
|
||
"vehicles:delete",
|
||
"admin:vehicles:manage",
|
||
"structures:create",
|
||
"structures:read",
|
||
"structures:update",
|
||
"structures:delete",
|
||
"admin:structures:manage",
|
||
"shipments:create",
|
||
"shipments:read",
|
||
"shipments:update",
|
||
"shipments:delete",
|
||
"admin:shipments:manage",
|
||
"bank-accounts:create",
|
||
"bank-accounts:read",
|
||
"bank-accounts:update",
|
||
"bank-accounts:delete",
|
||
"admin:bank-accounts:manage",
|
||
"bank-transactions:create",
|
||
"bank-transactions:read",
|
||
"bank-transactions:update",
|
||
"bank-transactions:delete",
|
||
"admin:bank-transactions:manage",
|
||
"ledger-entries:create",
|
||
"ledger-entries:read",
|
||
"ledger-entries:update",
|
||
"ledger-entries:delete",
|
||
"admin:ledger-entries:manage",
|
||
"locker-storages:create",
|
||
"locker-storages:read",
|
||
"locker-storages:update",
|
||
"locker-storages:delete",
|
||
"admin:locker-storages:manage",
|
||
"loadouts:create",
|
||
"loadouts:read",
|
||
"loadouts:update",
|
||
"loadouts:delete",
|
||
"admin:loadouts:manage",
|
||
"market-listings:create",
|
||
"market-listings:read",
|
||
"market-listings:update",
|
||
"market-listings:delete",
|
||
"admin:market-listings:manage",
|
||
"market-negotiations:create",
|
||
"market-negotiations:read",
|
||
"market-negotiations:update",
|
||
"market-negotiations:delete",
|
||
"admin:market-negotiations:manage",
|
||
"market-state:create",
|
||
"market-state:read",
|
||
"market-state:update",
|
||
"market-state:delete",
|
||
"admin:market-state:manage",
|
||
"projects:create",
|
||
"projects:read",
|
||
"projects:update",
|
||
"projects:delete",
|
||
"admin:projects:manage",
|
||
"labels:create",
|
||
"labels:read",
|
||
"labels:update",
|
||
"labels:delete",
|
||
"admin:labels:manage",
|
||
"sprints:create",
|
||
"sprints:read",
|
||
"sprints:update",
|
||
"sprints:delete",
|
||
"admin:sprints:manage",
|
||
"releases:create",
|
||
"releases:read",
|
||
"releases:update",
|
||
"releases:delete",
|
||
"admin:releases:manage",
|
||
"tickets:create",
|
||
"tickets:read",
|
||
"tickets:update",
|
||
"tickets:delete",
|
||
"admin:tickets:manage",
|
||
"ticket-votes:create",
|
||
"ticket-votes:read",
|
||
"ticket-votes:update",
|
||
"ticket-votes:delete",
|
||
"admin:ticket-votes:manage",
|
||
"game-structures:create",
|
||
"game-structures:read",
|
||
"game-structures:update",
|
||
"game-structures:delete",
|
||
"admin:game-structures:manage",
|
||
"game-vehicles:create",
|
||
"game-vehicles:read",
|
||
"game-vehicles:update",
|
||
"game-vehicles:delete",
|
||
"admin:game-vehicles:manage",
|
||
"game-npcs:create",
|
||
"game-npcs:read",
|
||
"game-npcs:update",
|
||
"game-npcs:delete",
|
||
"admin:game-npcs:manage",
|
||
"game-hard-resources:create",
|
||
"game-hard-resources:read",
|
||
"game-hard-resources:update",
|
||
"game-hard-resources:delete",
|
||
"admin:game-hard-resources:manage",
|
||
"game-event-logs:create",
|
||
"game-event-logs:read",
|
||
"game-event-logs:update",
|
||
"game-event-logs:delete",
|
||
"admin:game-event-logs:manage",
|
||
"maps:create",
|
||
"maps:read",
|
||
"maps:update",
|
||
"maps:delete",
|
||
"admin:maps:manage",
|
||
"map-roads:read",
|
||
"admin:map-roads:manage",
|
||
"map-zones:read",
|
||
"admin:map-zones:manage",
|
||
"resource-nodes:read",
|
||
"admin:resource-nodes:manage",
|
||
"narrative-events:create",
|
||
"narrative-events:read",
|
||
"narrative-events:update",
|
||
"narrative-events:delete",
|
||
"admin:narrative-events:manage",
|
||
"mission-files:create",
|
||
"mission-files:read",
|
||
"mission-files:update",
|
||
"mission-files:delete",
|
||
"admin:mission-files:manage",
|
||
"mod-lists:create",
|
||
"mod-lists:read",
|
||
"mod-lists:update",
|
||
"mod-lists:delete",
|
||
"admin:mod-lists:manage",
|
||
"respawn-tickets:create",
|
||
"respawn-tickets:read",
|
||
"respawn-tickets:update",
|
||
"respawn-tickets:delete",
|
||
"admin:respawn-tickets:manage",
|
||
"game-servers:create",
|
||
"game-servers:read",
|
||
"game-servers:update",
|
||
"game-servers:delete",
|
||
"admin:game-servers:manage",
|
||
"arma-sync-events:create",
|
||
"arma-sync-events:read",
|
||
"arma-sync-events:update",
|
||
"arma-sync-events:delete",
|
||
"admin:arma-sync-events:manage",
|
||
"arma-commands:create",
|
||
"arma-commands:read",
|
||
"arma-commands:update",
|
||
"arma-commands:delete",
|
||
"admin:arma-commands:manage",
|
||
"operation-events:create",
|
||
"operation-events:read",
|
||
"operation-events:update",
|
||
"operation-events:delete",
|
||
"admin:operation-events:manage",
|
||
"operation-effects:create",
|
||
"operation-effects:read",
|
||
"operation-effects:update",
|
||
"operation-effects:delete",
|
||
"admin:operation-effects:manage",
|
||
"operation-reservations:create",
|
||
"operation-reservations:read",
|
||
"operation-reservations:update",
|
||
"operation-reservations:delete",
|
||
"admin:operation-reservations:manage",
|
||
"operation-readiness:create",
|
||
"operation-readiness:read",
|
||
"operation-readiness:update",
|
||
"operation-readiness:delete",
|
||
"admin:operation-readiness:manage",
|
||
"zone-pressure:create",
|
||
"zone-pressure:read",
|
||
"zone-pressure:update",
|
||
"zone-pressure:delete",
|
||
"admin:zone-pressure:manage",
|
||
"game-rules:read",
|
||
"game-rules:update",
|
||
"shims:read",
|
||
"shims:update",
|
||
"logistics:manage",
|
||
"intelligence:manage",
|
||
"profiles:intel_excerpt:update",
|
||
"banking:manage",
|
||
"tickets:staff",
|
||
"discord:staff",
|
||
"discord:announce",
|
||
"custom-minefields:update",
|
||
"custom-minefields:delete",
|
||
"custom-minefield-scores:delete",
|
||
"custom-radio-tests:update",
|
||
"custom-radio-tests:delete",
|
||
"custom-radio-test-scores:delete",
|
||
];
|
||
|
||
/**
|
||
* Union type of every valid permission string.
|
||
* Use this to type-check permission arguments at compile time.
|
||
*/
|
||
export type Permission = (typeof ALL_PERMISSION_VALUES)[number];
|
||
|
||
/**
|
||
* Payload `select` field options, flattened with group-prefixed labels.
|
||
* e.g. `{ label: "Users › Create Users", value: "users:create" }`
|
||
*/
|
||
export const permissionSelectOptions: { label: string; value: string }[] =
|
||
PERMISSION_GROUPS.flatMap((g) =>
|
||
g.permissions.map((p) => {
|
||
let label = p.label;
|
||
if (Array.isArray(p.label)) label = p.label.join(" › ");
|
||
return {
|
||
label: `${g.group} › ${label}`,
|
||
value: p.value,
|
||
};
|
||
}),
|
||
);
|
||
|
||
/**
|
||
* Guard function — returns true if the given string is a valid permission.
|
||
* Useful for runtime validation of permission strings from DB or API input.
|
||
*/
|
||
export function isPermission(value: string): value is Permission {
|
||
return (ALL_PERMISSION_VALUES as readonly string[]).includes(value);
|
||
}
|