1
0
Fork 0
polaris-task-force/src/permissions/index.ts
Z8MB1E 1f230c0868 feat(missions): add a per-mission planning map with Arma markers
- New mission-map-markers collection (permission-gated, removed with its
  mission via a Missions beforeDelete hook) plus an opt-in
  classification.planningMapEnabled flag on missions.
- The mission page gains a planning section: place and edit Arma markers
  (icons, ellipses, rectangles, polylines) with debounced saves, an SQF copy
  export, and an Arma grid readout. Everyone who can read the mission sees the
  plan once enabled; editing requires missions:update or mission ownership.
- Base layers come from GET /api/map-features?layers=base, which skips the
  structure, node and shipment queries; marker icons render tinted by color
  exactly like in-game.
- Includes the hand-written migration, the missionMap service lib, server
  actions emitting mission:map-marker-* events, and integration plus e2e
  coverage.
2026-10-04 02:53:21 -04:00

1102 lines
36 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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: "Mission Role Sign-Ups",
permissions: [
{ value: "mission-role-signups:create", label: "Create" },
{ value: "mission-role-signups:read", label: "Read" },
{ value: "mission-role-signups:update", label: "Update" },
{ value: "mission-role-signups:delete", label: "Delete" },
{ value: "admin:mission-role-signups:manage", label: "Manage Admin Page" },
],
},
{
group: "Mission Map Markers",
permissions: [
{ value: "mission-map-markers:create", label: "Create" },
{ value: "mission-map-markers:read", label: "Read" },
{ value: "mission-map-markers:update", label: "Update" },
{ value: "mission-map-markers:delete", label: "Delete" },
{ value: "admin:mission-map-markers: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" },
],
},
{
group: "Tech Categories",
permissions: [
{ value: "tech-categories:create", label: "Create" },
{ value: "tech-categories:read", label: "Read" },
{ value: "tech-categories:update", label: "Update" },
{ value: "tech-categories:delete", label: "Delete" },
{ value: "admin:tech-categories: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: "maps:place", label: "Place Structures" },
{ value: "admin:maps:manage", label: "Manage Admin Page" },
],
},
{
group: "Map Features",
permissions: [
{ value: "map-roads:read", label: "Read Roads" },
{ value: "map-roads:author", label: "Author Roads" },
{ value: "admin:map-roads:manage", label: "Manage Roads Admin Page" },
{ value: "map-zones:read", label: "Read Zones" },
{ value: "map-zones:author", label: "Author Zones" },
{ value: "admin:map-zones:manage", label: "Manage Zones Admin Page" },
{ value: "resource-nodes:read", label: "Read Resource Nodes" },
{ value: "resource-nodes:author", label: "Author 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" },
],
},
{
group: "Announcements",
permissions: [
{ value: "announcements:create", label: "Create" },
{ value: "announcements:read", label: "Read" },
{ value: "announcements:update", label: "Update" },
{ value: "announcements:delete", label: "Delete" },
{ value: "admin:announcements:manage", label: "Manage Admin Page" },
],
},
{
group: "Surveys",
permissions: [
{ value: "forms:create", label: "Create Surveys" },
{ value: "forms:read", label: "Read Surveys" },
{ value: "forms:update", label: "Update Surveys" },
{ value: "forms:delete", label: "Delete Surveys" },
{ value: "form-submissions:read", label: "Read Submissions" },
{ value: "form-submissions:delete", label: "Delete Submissions" },
{ value: "admin:forms:manage", label: "Manage Surveys Admin Page" },
{ value: "admin:form-submissions:manage", label: "Manage Submissions 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",
"mission-role-signups:create",
"mission-role-signups:read",
"mission-role-signups:update",
"mission-role-signups:delete",
"admin:mission-role-signups:manage",
"mission-map-markers:create",
"mission-map-markers:read",
"mission-map-markers:update",
"mission-map-markers:delete",
"admin:mission-map-markers: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",
"tech-categories:create",
"tech-categories:read",
"tech-categories:update",
"tech-categories:delete",
"admin:tech-categories: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",
"maps:place",
"admin:maps:manage",
"map-roads:read",
"map-roads:author",
"admin:map-roads:manage",
"map-zones:read",
"map-zones:author",
"admin:map-zones:manage",
"resource-nodes:read",
"resource-nodes:author",
"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",
"announcements:create",
"announcements:read",
"announcements:update",
"announcements:delete",
"admin:announcements:manage",
"forms:create",
"forms:read",
"forms:update",
"forms:delete",
"form-submissions:read",
"form-submissions:delete",
"admin:forms:manage",
"admin:form-submissions:manage",
"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);
}