mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
`<module>:view` gates the backoffice sidebar entry, the route, and the API read all at once, so granting a user another module's list endpoint for a form dropdown also hands them that module's whole page. Seed a `:read` twin for every `:view` key and teach the freight guards to accept it wherever the matching `:view` is required — on GET/HEAD/OPTIONS only, since class and method guards AND together and a write route without its own method gate would otherwise be reachable. The frontend never checks `:read`, which is what keeps the module hidden. Twins are derived, not hand-written, so a new `:view` gets one for free. Grants stay hand-curated in iam.position_type_permissions.
321 lines
12 KiB
TypeScript
321 lines
12 KiB
TypeScript
import {
|
|
BOOKING_RULE_ENGINE_PERMISSIONS,
|
|
BOOKING_RULE_ENGINE_PERMISSION_KEYS,
|
|
deriveReadPermissions,
|
|
POSITION_PERMISSION_PRESETS,
|
|
ROLE_PERMISSION_PRESETS,
|
|
} from './freight-permissions.registry';
|
|
|
|
export type FreightSeedRole = {
|
|
key: string;
|
|
name: { en: string };
|
|
permissionKeys: string[];
|
|
};
|
|
|
|
export type FreightSeedPosition = {
|
|
key: string;
|
|
name: { en: string };
|
|
rank: number;
|
|
permissionKeys: string[];
|
|
};
|
|
|
|
const IAM_PERMISSION_KEYS = {
|
|
activateEmployee: "can:activateEmployee",
|
|
activateUser: "can:activateUser",
|
|
createEmployee: "can:createEmployee",
|
|
createPositionPermission: "can:create:position_permission",
|
|
createUnit: "can:create:unit",
|
|
createUserRole: "can:create:user_role",
|
|
deactivateEmployee: "can:deactivateEmployee",
|
|
deletePositionPermission: "can:delete:position_permission",
|
|
deleteUnit: "can:delete:unit",
|
|
deleteUserRole: "can:delete:user_role",
|
|
findAllOrganization: "can:find_all:organization",
|
|
manageOrganizationAdmin: "manage:organizationAdmin",
|
|
manageUnitAdmin: "manage:unitAdmin",
|
|
updateUnit: "can:update:unit",
|
|
viewPositionPermission: "can:view:position_permission",
|
|
viewUserRole: "can:view:user_role",
|
|
} as const;
|
|
|
|
export const EDR_FREIGHT_APPLICATION = {
|
|
id: "7f5a2175-c270-495b-bec9-d59ddbdab5d1",
|
|
key: "edr_freight_app",
|
|
name: {
|
|
am: "EDR Freight App",
|
|
en: "EDR Freight App",
|
|
},
|
|
} as const;
|
|
|
|
const EMPLOYEE_REGISTRATION_PERMISSIONS = [
|
|
{
|
|
id: "62b5aa2d-4ef6-474d-913a-994568dce1c8",
|
|
key: "edr_freight_app:employee_registration:view",
|
|
name: { am: "View employee registration", en: "View employee registration" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "8072204d-26de-4e62-88aa-74afd916a0cb",
|
|
key: "edr_freight_app:employee_registration:create",
|
|
name: { am: "Create employee registration", en: "Create employee registration" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "b7dc55a6-ae7c-4558-8c4e-7d8ce5c7fa08",
|
|
key: "edr_freight_app:employee_registration:update",
|
|
name: { am: "Update employee registration", en: "Update employee registration" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "7ef06121-bd31-4c0d-b36d-5401b4bfd05c",
|
|
key: "edr_freight_app:employee_registration:activate",
|
|
name: { am: "Activate employee registration", en: "Activate employee registration" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "2688e144-7f0c-4704-8d59-e92b0c08117a",
|
|
key: "edr_freight_app:employee_registration:deactivate",
|
|
name: { am: "Deactivate employee registration", en: "Deactivate employee registration" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
] as const;
|
|
|
|
const ROLE_ASSIGNMENT_PERMISSIONS = [
|
|
{
|
|
id: "4de87873-e00d-4330-9b4f-f4fb065f49e0",
|
|
key: "edr_freight_app:role_assignment:view",
|
|
name: { am: "View role assignment", en: "View role assignment" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "36f022b4-4b94-4220-a46c-df7bd1a1b184",
|
|
key: "edr_freight_app:role_assignment:assign",
|
|
name: { am: "Assign role", en: "Assign role" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "c1f34177-a0ae-4a46-a24a-3281b9137bab",
|
|
key: "edr_freight_app:role_assignment:replace",
|
|
name: { am: "Replace role assignment", en: "Replace role assignment" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
] as const;
|
|
|
|
const HIERARCHY_UNIT_PERMISSIONS = [
|
|
{
|
|
id: "2bfa2428-ec40-4588-9b01-dfacce6a2b82",
|
|
key: "edr_freight_app:hierarchy_units:view",
|
|
name: { am: "View hierarchy units", en: "View hierarchy units" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "1e92daff-9cc7-4a67-9994-879f34bfda16",
|
|
key: "edr_freight_app:hierarchy_units:create",
|
|
name: { am: "Create hierarchy unit", en: "Create hierarchy unit" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "4ef2d8ad-c627-4448-b4b6-dd6b8b602dc1",
|
|
key: "edr_freight_app:hierarchy_units:update",
|
|
name: { am: "Update hierarchy unit", en: "Update hierarchy unit" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "15353ac5-246b-42e6-9ac3-eb61c4f1cd22",
|
|
key: "edr_freight_app:hierarchy_units:delete",
|
|
name: { am: "Delete hierarchy unit", en: "Delete hierarchy unit" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
] as const;
|
|
|
|
const HIERARCHY_POSITION_PERMISSIONS = [
|
|
{
|
|
id: "37ff6f5b-9fb0-4139-af99-22fe54703029",
|
|
key: "edr_freight_app:hierarchy_positions:view",
|
|
name: { am: "View hierarchy positions", en: "View hierarchy positions" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "af6c091a-6448-4459-a635-c2181efd1de0",
|
|
key: "edr_freight_app:hierarchy_positions:create",
|
|
name: { am: "Create hierarchy position", en: "Create hierarchy position" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "e78f624d-b570-4cd6-8f16-12090a4a9d31",
|
|
key: "edr_freight_app:hierarchy_positions:update",
|
|
name: { am: "Update hierarchy position", en: "Update hierarchy position" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "7fba7887-a365-4281-96ea-fb14582b047e",
|
|
key: "edr_freight_app:hierarchy_positions:delete",
|
|
name: { am: "Delete hierarchy position", en: "Delete hierarchy position" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "a33905ff-f2b8-40b9-a8cf-e2968f6f46fb",
|
|
key: "edr_freight_app:hierarchy_positions:change_parent",
|
|
name: { am: "Change hierarchy position parent", en: "Change hierarchy position parent" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
] as const;
|
|
|
|
const HIERARCHY_EMPLOYEE_ASSIGNMENT_PERMISSIONS = [
|
|
{
|
|
id: "b6ca90ff-3e95-4af2-bac8-fb298ca62080",
|
|
key: "edr_freight_app:hierarchy_employee_assignment:view",
|
|
name: { am: "View hierarchy employee assignment", en: "View hierarchy employee assignment" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "0637472f-d6b7-4332-85bb-eaa6a02205c1",
|
|
key: "edr_freight_app:hierarchy_employee_assignment:invite",
|
|
name: { am: "Invite hierarchy employee assignment", en: "Invite hierarchy employee assignment" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
{
|
|
id: "de366c81-b6d1-4cf9-a5f1-a5c8a6fb5e7b",
|
|
key: "edr_freight_app:hierarchy_employee_assignment:assign",
|
|
name: { am: "Assign hierarchy employee assignment", en: "Assign hierarchy employee assignment" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
] as const;
|
|
|
|
const POSITION_TYPE_PERMISSIONS = [
|
|
{
|
|
id: "f258fb51-2890-4c93-b024-271b09d705d0",
|
|
key: "edr_freight_app:position_types:view",
|
|
name: { am: "View position types", en: "View position types" },
|
|
applicationKey: EDR_FREIGHT_APPLICATION.key,
|
|
},
|
|
] as const;
|
|
|
|
const EDR_FREIGHT_VIEWABLE_PERMISSIONS = [
|
|
...EMPLOYEE_REGISTRATION_PERMISSIONS,
|
|
...ROLE_ASSIGNMENT_PERMISSIONS,
|
|
...HIERARCHY_UNIT_PERMISSIONS,
|
|
...HIERARCHY_POSITION_PERMISSIONS,
|
|
...HIERARCHY_EMPLOYEE_ASSIGNMENT_PERMISSIONS,
|
|
...POSITION_TYPE_PERMISSIONS,
|
|
...BOOKING_RULE_ENGINE_PERMISSIONS,
|
|
];
|
|
|
|
export const EDR_FREIGHT_PERMISSIONS = [
|
|
...EDR_FREIGHT_VIEWABLE_PERMISSIONS,
|
|
// API-read twin of every `:view` key above — grants the module's GET routes
|
|
// without putting it in the backoffice sidebar. Seeded so they can be
|
|
// assigned; no role or position preset below grants one, that stays
|
|
// hand-curated in iam.position_type_permissions.
|
|
...deriveReadPermissions(EDR_FREIGHT_VIEWABLE_PERMISSIONS),
|
|
];
|
|
|
|
export { BOOKING_RULE_ENGINE_PERMISSION_KEYS } from './freight-permissions.registry';
|
|
|
|
export const EDR_FREIGHT_ROLES: FreightSeedRole[] = [
|
|
{
|
|
key: "edr_employee",
|
|
name: { en: "EDR Employee" },
|
|
permissionKeys: [
|
|
"edr_freight_app:employee_registration:view",
|
|
"edr_freight_app:role_assignment:view",
|
|
"edr_freight_app:hierarchy_units:view",
|
|
"edr_freight_app:hierarchy_positions:view",
|
|
"edr_freight_app:hierarchy_employee_assignment:view",
|
|
"edr_freight_app:position_types:view",
|
|
],
|
|
},
|
|
{
|
|
key: "edr_line_staff",
|
|
name: { en: "EDR Line Staff" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.lineStaff],
|
|
},
|
|
{
|
|
key: "edr_operations_officer",
|
|
name: { en: "EDR Operations Officer" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.operationsOfficer],
|
|
},
|
|
{
|
|
key: "edr_director",
|
|
name: { en: "EDR Director" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.director],
|
|
},
|
|
{
|
|
key: "edr_ceo",
|
|
name: { en: "EDR CEO" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.ceo],
|
|
},
|
|
{
|
|
key: "edr_finance",
|
|
name: { en: "EDR Finance" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.finance],
|
|
},
|
|
{
|
|
key: "edr_marketing",
|
|
name: { en: "EDR Marketing" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.marketing],
|
|
},
|
|
{
|
|
key: "edr_gl_ethiopia",
|
|
name: { en: "EDR Global Logistics — Ethiopia" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.glEthiopia],
|
|
},
|
|
{
|
|
key: "edr_gl_djibouti",
|
|
name: { en: "EDR Global Logistics — Djibouti" },
|
|
permissionKeys: [...ROLE_PERMISSION_PRESETS.glDjibouti],
|
|
},
|
|
{
|
|
key: "edr_org_manager",
|
|
name: { en: "EDR Org Manager" },
|
|
permissionKeys: [
|
|
...BOOKING_RULE_ENGINE_PERMISSION_KEYS,
|
|
...EMPLOYEE_REGISTRATION_PERMISSIONS.map((p) => p.key),
|
|
...ROLE_ASSIGNMENT_PERMISSIONS.map((p) => p.key),
|
|
...HIERARCHY_UNIT_PERMISSIONS.map((p) => p.key),
|
|
...HIERARCHY_POSITION_PERMISSIONS.map((p) => p.key),
|
|
...HIERARCHY_EMPLOYEE_ASSIGNMENT_PERMISSIONS.map((p) => p.key),
|
|
...POSITION_TYPE_PERMISSIONS.map((p) => p.key),
|
|
IAM_PERMISSION_KEYS.createEmployee,
|
|
IAM_PERMISSION_KEYS.deactivateEmployee,
|
|
IAM_PERMISSION_KEYS.activateEmployee,
|
|
IAM_PERMISSION_KEYS.activateUser,
|
|
IAM_PERMISSION_KEYS.createUserRole,
|
|
IAM_PERMISSION_KEYS.deleteUserRole,
|
|
IAM_PERMISSION_KEYS.viewUserRole,
|
|
IAM_PERMISSION_KEYS.manageOrganizationAdmin,
|
|
IAM_PERMISSION_KEYS.manageUnitAdmin,
|
|
IAM_PERMISSION_KEYS.createUnit,
|
|
IAM_PERMISSION_KEYS.updateUnit,
|
|
IAM_PERMISSION_KEYS.deleteUnit,
|
|
IAM_PERMISSION_KEYS.createPositionPermission,
|
|
IAM_PERMISSION_KEYS.deletePositionPermission,
|
|
IAM_PERMISSION_KEYS.viewPositionPermission,
|
|
IAM_PERMISSION_KEYS.findAllOrganization,
|
|
],
|
|
},
|
|
{
|
|
key: "edr_customer",
|
|
name: { en: "EDR Customer" },
|
|
permissionKeys: [],
|
|
},
|
|
];
|
|
|
|
/**
|
|
* Operational positions (positions-as-roles). Seeded as Position +
|
|
* PositionPermission rows (NOT Role/RolePermission). Users get their access by
|
|
* being assigned to a Position via EmployeePosition.
|
|
*/
|
|
export const EDR_FREIGHT_POSITIONS: FreightSeedPosition[] = [
|
|
{ key: "chief", name: { en: "Chief" }, rank: 1, permissionKeys: [...POSITION_PERMISSION_PRESETS.chief] },
|
|
{ key: "director", name: { en: "Director" }, rank: 2, permissionKeys: [...POSITION_PERMISSION_PRESETS.director] },
|
|
{ key: "ceo", name: { en: "CEO" }, rank: 1, permissionKeys: [...POSITION_PERMISSION_PRESETS.ceo] },
|
|
{ key: "ethiopian_gl", name: { en: "Ethiopian GL" }, rank: 3, permissionKeys: [...POSITION_PERMISSION_PRESETS.ethiopianGl] },
|
|
{ key: "djibouti_gl", name: { en: "Djibouti GL" }, rank: 3, permissionKeys: [...POSITION_PERMISSION_PRESETS.djiboutiGl] },
|
|
{ key: "marketer", name: { en: "Marketer" }, rank: 4, permissionKeys: [...POSITION_PERMISSION_PRESETS.marketer] },
|
|
{ key: "operation", name: { en: "Operation" }, rank: 4, permissionKeys: [...POSITION_PERMISSION_PRESETS.operation] },
|
|
{ key: "operations_chief", name: { en: "Operations Chief" }, rank: 2, permissionKeys: [...POSITION_PERMISSION_PRESETS.operationsChief] },
|
|
{ key: "dispatcher", name: { en: "Dispatcher" }, rank: 4, permissionKeys: [...POSITION_PERMISSION_PRESETS.dispatcher] },
|
|
{ key: "truck_machinery_chief", name: { en: "Truck & Machinery Chief" }, rank: 2, permissionKeys: [...POSITION_PERMISSION_PRESETS.truckMachineryChief] },
|
|
];
|