Merge pull request #1412 from Tria-plc/freight_feature/usermanagement

feat: enhance booking and audit log functionalities
This commit is contained in:
marshal
2026-08-25 02:50:34 +03:00
committed by GitHub
28 changed files with 1356 additions and 86 deletions

View File

@@ -36,6 +36,8 @@ export interface AuditLog {
userName: string | null;
userRole: string | null;
resourceId: string | null;
/** Human identifier of the record (booking reference, train number); '' when unknown. */
reference: string;
/** Sanitized request body; files appear as `__file` descriptors. */
request: Record<string, unknown> | null;
ipAddress: string | null;
@@ -52,6 +54,14 @@ export interface AuditLogQuery {
userId?: string;
method?: AuditMethod;
resourceId?: string;
/** Case-insensitive prefix match on the human identifier. */
reference?: string;
/** Staff name, substring match. */
userName?: string;
/** Action title, substring match. */
title?: string;
/** Free text across reference, record id, staff name and action title. */
q?: string;
/** Omit for "any outcome". */
isSuccess?: boolean;
/** Inclusive ISO 8601 bounds. */
@@ -72,6 +82,10 @@ function toParams(query: AuditLogQuery): Record<string, string | number> {
if (query.userId) params.userId = query.userId;
if (query.method) params.method = query.method;
if (query.resourceId) params.resourceId = query.resourceId;
if (query.reference) params.reference = query.reference;
if (query.userName) params.userName = query.userName;
if (query.title) params.title = query.title;
if (query.q) params.q = query.q;
if (query.isSuccess !== undefined) params.isSuccess = String(query.isSuccess);
if (query.from) params.from = query.from;
if (query.to) params.to = query.to;
@@ -94,4 +108,10 @@ export const auditLogsService = {
const response = await client.get<ApiResponse<string[]>>(`${BASE}/types`);
return unwrap(response.data);
},
/** Distinct action titles present, for the action filter dropdown. */
actions: async (): Promise<string[]> => {
const response = await client.get<ApiResponse<string[]>>(`${BASE}/actions`);
return unwrap(response.data);
},
};