add permissions and fix issues

This commit is contained in:
Marshal
2026-07-23 20:24:20 +00:00
parent 40f16f3cec
commit 668b5e1c9d
40 changed files with 18634 additions and 342 deletions

View File

@@ -46,7 +46,10 @@ export const FREIGHT_PERMS = {
approveDirector: "edr_freight_app:contracts:approve_director",
approveCeo: "edr_freight_app:contracts:approve_ceo",
generateContract: "edr_freight_app:contracts:generate_contract",
signStaff: "edr_freight_app:contracts:sign_staff",
signStaff: {
bulk: "edr_freight_app:contracts:sign_staff:bulk",
container: "edr_freight_app:contracts:sign_staff:container",
},
clearanceReview: "edr_freight_app:contracts:clearance_review",
finalizeClearance: "edr_freight_app:contracts:finalize_clearance",
createBooking: "edr_freight_app:contracts:create_booking",
@@ -57,7 +60,6 @@ export const FREIGHT_PERMS = {
},
trainScheduling: {
view: "edr_freight_app:train_scheduling:view",
manage: "edr_freight_app:train_scheduling:manage",
create: "edr_freight_app:train_scheduling:create",
update: "edr_freight_app:train_scheduling:update",
cancel: "edr_freight_app:train_scheduling:cancel",
@@ -509,8 +511,18 @@ export function canViewScheduling(user: AuthUser | null | undefined): boolean {
return hasPermission(user, FREIGHT_PERMS.trainScheduling.view);
}
/** Any train-scheduling write action (create / update / cancel / reschedule). */
export function canManageScheduling(user: AuthUser | null | undefined): boolean {
return hasPermission(user, FREIGHT_PERMS.trainScheduling.manage);
return (
hasPermission(user, FREIGHT_PERMS.trainScheduling.create) ||
hasPermission(user, FREIGHT_PERMS.trainScheduling.update) ||
hasPermission(user, FREIGHT_PERMS.trainScheduling.cancel) ||
hasPermission(user, FREIGHT_PERMS.trainScheduling.reschedule)
);
}
export function canCreateSchedule(user: AuthUser | null | undefined): boolean {
return hasPermission(user, FREIGHT_PERMS.trainScheduling.create);
}
export function canViewFleet(user: AuthUser | null | undefined): boolean {
@@ -546,12 +558,17 @@ export function isFreightAdmin(user: AuthUser | null | undefined): boolean {
return hasPermission(user, FREIGHT_PERMS.admin);
}
export function ruleEngineViewKey(slug: RuleEngineResourceSlug): string {
return `edr_freight_app:rule_engine:${slugToResourceKey(slug)}:view`;
export type RuleEngineAction = "view" | "create" | "update" | "delete";
export function ruleEngineActionKey(
slug: RuleEngineResourceSlug,
action: RuleEngineAction,
): string {
return `edr_freight_app:rule_engine:${slugToResourceKey(slug)}:${action}`;
}
export function ruleEngineManageKey(slug: RuleEngineResourceSlug): string {
return `edr_freight_app:rule_engine:${slugToResourceKey(slug)}:manage`;
export function ruleEngineViewKey(slug: RuleEngineResourceSlug): string {
return ruleEngineActionKey(slug, "view");
}
/**
@@ -572,10 +589,19 @@ export function canApproveRuleEngineChange(
export function canAccessRuleEngineResource(
user: AuthUser | null | undefined,
slug: RuleEngineResourceSlug,
mode: "view" | "manage",
mode: RuleEngineAction,
): boolean {
const key = mode === "manage" ? ruleEngineManageKey(slug) : ruleEngineViewKey(slug);
return hasPermission(user, key);
return hasPermission(user, ruleEngineActionKey(slug, mode));
}
/** Holds any write action on the resource — for surfaces gated on "can edit at all". */
export function canWriteRuleEngineResource(
user: AuthUser | null | undefined,
slug: RuleEngineResourceSlug,
): boolean {
return (["create", "update", "delete"] as const).some((a) =>
canAccessRuleEngineResource(user, slug, a),
);
}
export function canAccessAnyRuleEngineView(