hazo_audit 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGE_LOG.md +80 -0
- package/README.md +57 -1
- package/config/hazo_audit_config.ini.sample +28 -0
- package/db_setup_postgres.sql +76 -0
- package/db_setup_sqlite.sql +72 -0
- package/dist/client/AuditViewer.js +1 -1
- package/dist/client/FieldAuditIcon.d.ts.map +1 -1
- package/dist/client/FieldAuditIcon.js +3 -3
- package/dist/client/FieldAuditIcon.js.map +1 -1
- package/dist/client/FieldAuditTrail.d.ts.map +1 -1
- package/dist/client/FieldAuditTrail.js +72 -9
- package/dist/client/FieldAuditTrail.js.map +1 -1
- package/dist/client/RevertConfirmDialog.js +1 -1
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config/hazo_audit_config.d.ts +99 -0
- package/dist/lib/config/hazo_audit_config.d.ts.map +1 -0
- package/dist/lib/config/hazo_audit_config.js +67 -0
- package/dist/lib/config/hazo_audit_config.js.map +1 -0
- package/dist/nextjs/index.d.ts +12 -0
- package/dist/nextjs/index.d.ts.map +1 -1
- package/dist/nextjs/index.js +307 -218
- package/dist/nextjs/index.js.map +1 -1
- package/dist/server/audited_crud.js +3 -3
- package/dist/server/audited_crud.js.map +1 -1
- package/dist/server/context.js +3 -3
- package/dist/server/context.js.map +1 -1
- package/dist/server/diff.js +11 -3
- package/dist/server/diff.js.map +1 -1
- package/dist/server/errors.d.ts +10 -1
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +16 -2
- package/dist/server/errors.js.map +1 -1
- package/dist/server/intent.js +3 -3
- package/dist/server/intent.js.map +1 -1
- package/dist/server/outbox.js +2 -2
- package/dist/server/outbox.js.map +1 -1
- package/dist/server/worker.d.ts +7 -7
- package/dist/server/worker.d.ts.map +1 -1
- package/dist/server/worker.js +60 -15
- package/dist/server/worker.js.map +1 -1
- package/dist/server/wrap.js +2 -2
- package/dist/server/wrap.js.map +1 -1
- package/dist/utils/logger.d.ts +25 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/uuid.d.ts +19 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +22 -0
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +36 -21
- package/dist/client/cn.d.ts +0 -3
- package/dist/client/cn.d.ts.map +0 -1
- package/dist/client/cn.js +0 -6
- package/dist/client/cn.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -26,7 +26,50 @@ export interface FieldAuditProps {
|
|
|
26
26
|
subjectId: string;
|
|
27
27
|
/** Base path for audit routes. Defaults to `/api/audit`. */
|
|
28
28
|
api_base?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Map of intent `event_name` → display label. When an intent event shares a
|
|
31
|
+
* `correlation_id` with a field event, the field event's actor line is
|
|
32
|
+
* suffixed with ` (via <label>)` so users can see when a value came from
|
|
33
|
+
* prefill / import / export rather than direct typing.
|
|
34
|
+
*
|
|
35
|
+
* Apps emit intents via `auditIntent(adapter, name, callback, opts)` from
|
|
36
|
+
* `hazo_audit/server`; the package handles the correlation lookup.
|
|
37
|
+
*
|
|
38
|
+
* Example:
|
|
39
|
+
* ```ts
|
|
40
|
+
* intentLabels={{
|
|
41
|
+
* survey_prefill_key_info: 'auto-fill',
|
|
42
|
+
* wp_pdf_prefill: 'PDF import',
|
|
43
|
+
* }}
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* `.completed` and `.failed` suffixes are stripped before lookup, so the map
|
|
47
|
+
* only needs the bare event names.
|
|
48
|
+
*/
|
|
49
|
+
intentLabels?: Record<string, string>;
|
|
50
|
+
/**
|
|
51
|
+
* Override the op badge labels rendered next to each event in the trail.
|
|
52
|
+
* Defaults to `{ insert: 'Added', update: 'Changed', delete: 'Removed' }`.
|
|
53
|
+
*
|
|
54
|
+
* Pass any subset to override individual ops; unspecified ops keep the
|
|
55
|
+
* defaults. Pass an empty string to fall back to the raw DB op (lowercased).
|
|
56
|
+
*/
|
|
57
|
+
opLabels?: OpLabels;
|
|
29
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Friendly op label overrides for the audit trail badge. Keys correspond to
|
|
61
|
+
* the database `op` value on `hazo_audit_field` rows.
|
|
62
|
+
*/
|
|
63
|
+
export interface OpLabels {
|
|
64
|
+
insert?: string;
|
|
65
|
+
update?: string;
|
|
66
|
+
delete?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Default friendly labels for the op badge. Action-oriented, past-tense so
|
|
70
|
+
* the badge reads naturally next to the actor: "Added by Pubs Abayasiri".
|
|
71
|
+
*/
|
|
72
|
+
export declare const DEFAULT_OP_LABELS: Required<OpLabels>;
|
|
30
73
|
/**
|
|
31
74
|
* Canonicalises a JSONB path (e.g., `working_paper.sections.0.name`) into a
|
|
32
75
|
* stable, human-readable identifier. Apps register these by name in
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,eAAO,MAAM,kBAAkB,EAAG,oBAA6B,CAAC;AAChE,eAAO,MAAM,oBAAoB,EAAG,sBAA+B,CAAC;AACpE,eAAO,MAAM,wBAAwB,EAAG,0BAAmC,CAAC;AAM5E,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,gBAAgB,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,4 +17,13 @@
|
|
|
17
17
|
export const AUDIT_VIEW_HISTORY = 'view_audit_history';
|
|
18
18
|
export const AUDIT_VIEW_SENSITIVE = 'view_sensitive_audit';
|
|
19
19
|
export const AUDIT_VIEW_ACROSS_SCOPES = 'view_audit_across_scopes';
|
|
20
|
+
/**
|
|
21
|
+
* Default friendly labels for the op badge. Action-oriented, past-tense so
|
|
22
|
+
* the badge reads naturally next to the actor: "Added by Pubs Abayasiri".
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_OP_LABELS = {
|
|
25
|
+
insert: 'Added',
|
|
26
|
+
update: 'Changed',
|
|
27
|
+
delete: 'Removed',
|
|
28
|
+
};
|
|
20
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,gFAAgF;AAChF,2EAA2E;AAC3E,+DAA+D;AAC/D,gFAAgF;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAA6B,CAAC;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAA+B,CAAC;AACpE,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,gFAAgF;AAChF,2EAA2E;AAC3E,+DAA+D;AAC/D,gFAAgF;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAA6B,CAAC;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAA+B,CAAC;AACpE,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAAmC,CAAC;AAuE5E;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;CAClB,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo_audit standard workspace-configuration schema + loader.
|
|
3
|
+
*
|
|
4
|
+
* Wraps hazo_core's `loadConfig` with a Zod schema that mirrors the
|
|
5
|
+
* `[general]` and `[log.overrides]` sections of `config/hazo_audit_config.ini`.
|
|
6
|
+
*
|
|
7
|
+
* Capture / retention / worker / overrides sections continue to be loaded
|
|
8
|
+
* by `src/server/config.ts::loadAuditConfig()` — that's the package-specific
|
|
9
|
+
* runtime config layer and is kept separate so the workspace-standard loader
|
|
10
|
+
* stays a thin Zod wrapper.
|
|
11
|
+
*
|
|
12
|
+
* Resolution order (per hazo_core/loadConfig):
|
|
13
|
+
* 1. <pkg>_config.ini at process.cwd()/config/ or package root
|
|
14
|
+
* 2. <pkg>_config.<HAZO_ENV>.ini overlay
|
|
15
|
+
* 3. HAZO_AUDIT_<SECTION>_<KEY> env-var overrides
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
declare const schema: z.ZodNullable<z.ZodObject<{
|
|
19
|
+
general: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
env: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
env?: string | undefined;
|
|
23
|
+
}, {
|
|
24
|
+
env?: string | undefined;
|
|
25
|
+
}>>;
|
|
26
|
+
log: z.ZodOptional<z.ZodObject<{
|
|
27
|
+
overrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
28
|
+
}, "strip", z.ZodTypeAny, {
|
|
29
|
+
overrides?: Record<string, string> | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
overrides?: Record<string, string> | undefined;
|
|
32
|
+
}>>;
|
|
33
|
+
retention: z.ZodOptional<z.ZodObject<{
|
|
34
|
+
outbox_drained_ttl_days: z.ZodOptional<z.ZodString>;
|
|
35
|
+
outbox_failed_ttl_days: z.ZodOptional<z.ZodString>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
outbox_drained_ttl_days?: string | undefined;
|
|
38
|
+
outbox_failed_ttl_days?: string | undefined;
|
|
39
|
+
}, {
|
|
40
|
+
outbox_drained_ttl_days?: string | undefined;
|
|
41
|
+
outbox_failed_ttl_days?: string | undefined;
|
|
42
|
+
}>>;
|
|
43
|
+
worker: z.ZodOptional<z.ZodObject<{
|
|
44
|
+
poll_ms: z.ZodOptional<z.ZodString>;
|
|
45
|
+
max_attempts: z.ZodOptional<z.ZodString>;
|
|
46
|
+
backoff_initial_ms: z.ZodOptional<z.ZodString>;
|
|
47
|
+
reaper_interval_ms: z.ZodOptional<z.ZodString>;
|
|
48
|
+
}, "strip", z.ZodTypeAny, {
|
|
49
|
+
poll_ms?: string | undefined;
|
|
50
|
+
max_attempts?: string | undefined;
|
|
51
|
+
backoff_initial_ms?: string | undefined;
|
|
52
|
+
reaper_interval_ms?: string | undefined;
|
|
53
|
+
}, {
|
|
54
|
+
poll_ms?: string | undefined;
|
|
55
|
+
max_attempts?: string | undefined;
|
|
56
|
+
backoff_initial_ms?: string | undefined;
|
|
57
|
+
reaper_interval_ms?: string | undefined;
|
|
58
|
+
}>>;
|
|
59
|
+
}, "strip", z.ZodTypeAny, {
|
|
60
|
+
log?: {
|
|
61
|
+
overrides?: Record<string, string> | undefined;
|
|
62
|
+
} | undefined;
|
|
63
|
+
general?: {
|
|
64
|
+
env?: string | undefined;
|
|
65
|
+
} | undefined;
|
|
66
|
+
retention?: {
|
|
67
|
+
outbox_drained_ttl_days?: string | undefined;
|
|
68
|
+
outbox_failed_ttl_days?: string | undefined;
|
|
69
|
+
} | undefined;
|
|
70
|
+
worker?: {
|
|
71
|
+
poll_ms?: string | undefined;
|
|
72
|
+
max_attempts?: string | undefined;
|
|
73
|
+
backoff_initial_ms?: string | undefined;
|
|
74
|
+
reaper_interval_ms?: string | undefined;
|
|
75
|
+
} | undefined;
|
|
76
|
+
}, {
|
|
77
|
+
log?: {
|
|
78
|
+
overrides?: Record<string, string> | undefined;
|
|
79
|
+
} | undefined;
|
|
80
|
+
general?: {
|
|
81
|
+
env?: string | undefined;
|
|
82
|
+
} | undefined;
|
|
83
|
+
retention?: {
|
|
84
|
+
outbox_drained_ttl_days?: string | undefined;
|
|
85
|
+
outbox_failed_ttl_days?: string | undefined;
|
|
86
|
+
} | undefined;
|
|
87
|
+
worker?: {
|
|
88
|
+
poll_ms?: string | undefined;
|
|
89
|
+
max_attempts?: string | undefined;
|
|
90
|
+
backoff_initial_ms?: string | undefined;
|
|
91
|
+
reaper_interval_ms?: string | undefined;
|
|
92
|
+
} | undefined;
|
|
93
|
+
}>>;
|
|
94
|
+
export type AuditStandardConfig = NonNullable<z.infer<typeof schema>>;
|
|
95
|
+
export declare function getAuditConfig(): AuditStandardConfig;
|
|
96
|
+
/** Reset the in-memory cache. Mainly for tests. */
|
|
97
|
+
export declare function resetAuditConfigCache(): void;
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=hazo_audit_config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_audit_config.d.ts","sourceRoot":"","sources":["../../../src/lib/config/hazo_audit_config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BC,CAAC;AAEd,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;AAItE,wBAAgB,cAAc,IAAI,mBAAmB,CAYpD;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo_audit standard workspace-configuration schema + loader.
|
|
3
|
+
*
|
|
4
|
+
* Wraps hazo_core's `loadConfig` with a Zod schema that mirrors the
|
|
5
|
+
* `[general]` and `[log.overrides]` sections of `config/hazo_audit_config.ini`.
|
|
6
|
+
*
|
|
7
|
+
* Capture / retention / worker / overrides sections continue to be loaded
|
|
8
|
+
* by `src/server/config.ts::loadAuditConfig()` — that's the package-specific
|
|
9
|
+
* runtime config layer and is kept separate so the workspace-standard loader
|
|
10
|
+
* stays a thin Zod wrapper.
|
|
11
|
+
*
|
|
12
|
+
* Resolution order (per hazo_core/loadConfig):
|
|
13
|
+
* 1. <pkg>_config.ini at process.cwd()/config/ or package root
|
|
14
|
+
* 2. <pkg>_config.<HAZO_ENV>.ini overlay
|
|
15
|
+
* 3. HAZO_AUDIT_<SECTION>_<KEY> env-var overrides
|
|
16
|
+
*/
|
|
17
|
+
import { loadConfig } from 'hazo_core';
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
const schema = z
|
|
20
|
+
.object({
|
|
21
|
+
general: z
|
|
22
|
+
.object({
|
|
23
|
+
env: z.string().optional(),
|
|
24
|
+
})
|
|
25
|
+
.optional(),
|
|
26
|
+
log: z
|
|
27
|
+
.object({
|
|
28
|
+
overrides: z.record(z.string(), z.string()).optional(),
|
|
29
|
+
})
|
|
30
|
+
.optional(),
|
|
31
|
+
retention: z
|
|
32
|
+
.object({
|
|
33
|
+
outbox_drained_ttl_days: z.string().optional(),
|
|
34
|
+
outbox_failed_ttl_days: z.string().optional(),
|
|
35
|
+
})
|
|
36
|
+
.optional(),
|
|
37
|
+
worker: z
|
|
38
|
+
.object({
|
|
39
|
+
poll_ms: z.string().optional(),
|
|
40
|
+
max_attempts: z.string().optional(),
|
|
41
|
+
backoff_initial_ms: z.string().optional(),
|
|
42
|
+
reaper_interval_ms: z.string().optional(),
|
|
43
|
+
})
|
|
44
|
+
.optional(),
|
|
45
|
+
})
|
|
46
|
+
.nullable();
|
|
47
|
+
let _cached = null;
|
|
48
|
+
export function getAuditConfig() {
|
|
49
|
+
if (_cached !== null)
|
|
50
|
+
return _cached;
|
|
51
|
+
try {
|
|
52
|
+
_cached =
|
|
53
|
+
loadConfig({
|
|
54
|
+
pkg: 'hazo_audit',
|
|
55
|
+
schema: schema,
|
|
56
|
+
}) ?? {};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
_cached = {};
|
|
60
|
+
}
|
|
61
|
+
return _cached;
|
|
62
|
+
}
|
|
63
|
+
/** Reset the in-memory cache. Mainly for tests. */
|
|
64
|
+
export function resetAuditConfigCache() {
|
|
65
|
+
_cached = null;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=hazo_audit_config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_audit_config.js","sourceRoot":"","sources":["../../../src/lib/config/hazo_audit_config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,CAAC;KACb,MAAM,CAAC;IACN,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC3B,CAAC;SACD,QAAQ,EAAE;IACb,GAAG,EAAE,CAAC;SACH,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC;SACD,QAAQ,EAAE;IACb,SAAS,EAAE,CAAC;SACT,MAAM,CAAC;QACN,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9C,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9C,CAAC;SACD,QAAQ,EAAE;IACb,MAAM,EAAE,CAAC;SACN,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACnC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACzC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC1C,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,QAAQ,EAAE,CAAC;AAId,IAAI,OAAO,GAA+B,IAAI,CAAC;AAE/C,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,CAAC;QACH,OAAO;YACL,UAAU,CAAsB;gBAC9B,GAAG,EAAE,YAAY;gBACjB,MAAM,EAAE,MAAe;aACxB,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,qBAAqB;IACnC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC"}
|
package/dist/nextjs/index.d.ts
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
* their existing auth system (typically hazo_auth's hazo_get_tenant_auth)
|
|
6
6
|
* without a hard module dep at this layer.
|
|
7
7
|
*
|
|
8
|
+
* Every handler wraps its body with hazo_core's `withContext` so the
|
|
9
|
+
* correlation ID flows through every nested log call and downstream
|
|
10
|
+
* `fetchWithRequestId` outbound request. Errors are routed through
|
|
11
|
+
* `handleError()` which is HazoError-aware: 5xx → logger.error, 4xx →
|
|
12
|
+
* logger.warn.
|
|
13
|
+
*
|
|
8
14
|
* Mounting (Next.js App Router):
|
|
9
15
|
*
|
|
10
16
|
* // app/api/audit/events/route.ts
|
|
@@ -46,6 +52,7 @@ export interface AuditRequest extends Request {
|
|
|
46
52
|
nextUrl?: URL;
|
|
47
53
|
}
|
|
48
54
|
import type { HazoConnectAdapter } from 'hazo_connect';
|
|
55
|
+
import { type Logger } from '../utils/logger.js';
|
|
49
56
|
export interface AuditAuth {
|
|
50
57
|
user_id: string;
|
|
51
58
|
scope_id: string | null;
|
|
@@ -65,6 +72,11 @@ export interface AuditEventsRoutesOptions {
|
|
|
65
72
|
/** Default page size for list. Defaults to 50, capped at 200. */
|
|
66
73
|
default_limit?: number;
|
|
67
74
|
max_limit?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Optional logger override. Defaults to `get_logger()` (hazo_core's
|
|
77
|
+
* `createLogger('hazo_audit')`).
|
|
78
|
+
*/
|
|
79
|
+
logger?: Logger;
|
|
68
80
|
}
|
|
69
81
|
type NextHandler = (req: AuditRequest, ctx?: {
|
|
70
82
|
params: Promise<Record<string, string>> | Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nextjs/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nextjs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO;IAC3C,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IAC/D,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AACD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAWvD,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,kBAAkB,CAAC;IAClC,qEAAqE;IACrE,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,WAAW,GAAG,CACjB,GAAG,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACvE,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC;IAC9B,MAAM,EAAE;QAAE,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC;CAC9B;AAqED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CA4TnB"}
|