@flipboxlabs/aws-audit-sdk 1.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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/audits.d.ts +188 -0
  4. package/dist/audits.d.ts.map +1 -0
  5. package/dist/audits.js +225 -0
  6. package/dist/batch/batch-processor.d.ts +81 -0
  7. package/dist/batch/batch-processor.d.ts.map +1 -0
  8. package/dist/batch/batch-processor.js +102 -0
  9. package/dist/batch/index.d.ts +2 -0
  10. package/dist/batch/index.d.ts.map +1 -0
  11. package/dist/batch/index.js +1 -0
  12. package/dist/config.d.ts +65 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +44 -0
  15. package/dist/constants.d.ts +147 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +191 -0
  18. package/dist/events/batch-handler.d.ts +62 -0
  19. package/dist/events/batch-handler.d.ts.map +1 -0
  20. package/dist/events/batch-handler.js +92 -0
  21. package/dist/events/bus.d.ts +79 -0
  22. package/dist/events/bus.d.ts.map +1 -0
  23. package/dist/events/bus.js +86 -0
  24. package/dist/events/index.d.ts +3 -0
  25. package/dist/events/index.d.ts.map +1 -0
  26. package/dist/events/index.js +2 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/middleware/middy.d.ts +66 -0
  31. package/dist/middleware/middy.d.ts.map +1 -0
  32. package/dist/middleware/middy.js +105 -0
  33. package/dist/repository.d.ts +421 -0
  34. package/dist/repository.d.ts.map +1 -0
  35. package/dist/repository.js +486 -0
  36. package/dist/repository.utils.d.ts +37 -0
  37. package/dist/repository.utils.d.ts.map +1 -0
  38. package/dist/repository.utils.js +70 -0
  39. package/dist/schema/audit.d.ts +202 -0
  40. package/dist/schema/audit.d.ts.map +1 -0
  41. package/dist/schema/audit.js +48 -0
  42. package/dist/schema/common.d.ts +128 -0
  43. package/dist/schema/common.d.ts.map +1 -0
  44. package/dist/schema/common.js +148 -0
  45. package/dist/schema/index.d.ts +27 -0
  46. package/dist/schema/index.d.ts.map +1 -0
  47. package/dist/schema/index.js +26 -0
  48. package/dist/schema/log.d.ts +211 -0
  49. package/dist/schema/log.d.ts.map +1 -0
  50. package/dist/schema/log.js +179 -0
  51. package/dist/schema/model.d.ts +110 -0
  52. package/dist/schema/model.d.ts.map +1 -0
  53. package/dist/schema/model.js +86 -0
  54. package/dist/schema/service.d.ts +189 -0
  55. package/dist/schema/service.d.ts.map +1 -0
  56. package/dist/schema/service.js +89 -0
  57. package/dist/schema/storage.d.ts +105 -0
  58. package/dist/schema/storage.d.ts.map +1 -0
  59. package/dist/schema/storage.js +63 -0
  60. package/dist/service.d.ts +285 -0
  61. package/dist/service.d.ts.map +1 -0
  62. package/dist/service.js +237 -0
  63. package/dist/test-config.d.ts +56 -0
  64. package/dist/test-config.d.ts.map +1 -0
  65. package/dist/test-config.js +24 -0
  66. package/dist/types.d.ts +40 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +1 -0
  69. package/dist/utils.d.ts +231 -0
  70. package/dist/utils.d.ts.map +1 -0
  71. package/dist/utils.js +313 -0
  72. package/package.json +85 -0
@@ -0,0 +1,421 @@
1
+ import type { Logger } from "@aws-lambda-powertools/logger";
2
+ import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
3
+ import type { NativeAttributeValue } from "@aws-sdk/util-dynamodb";
4
+ import type { AuditConfig } from "./config.js";
5
+ import { type Audit } from "./schema/audit.js";
6
+ import { type Pagination } from "./schema/model.js";
7
+ import type { UpsertAuditInput } from "./schema/service.js";
8
+ import type { AnyApp, AnyResourceType, InferApp, InferResourceType } from "./types.js";
9
+ /**
10
+ * DynamoDB TTL attribute structure.
11
+ */
12
+ export interface TTLAttribute {
13
+ /** Unix timestamp in seconds when the item should expire */
14
+ ttl: number;
15
+ }
16
+ /**
17
+ * Generic type for unmarshalled DynamoDB attributes.
18
+ */
19
+ export type UnmarshalledAttributes = {
20
+ [key: string]: NativeAttributeValue;
21
+ };
22
+ /**
23
+ * Identifiers used to locate audit records in DynamoDB.
24
+ * Used for constructing primary and secondary keys.
25
+ */
26
+ export type Identifiers = {
27
+ /** Tenant/organization identifier for multi-tenancy support (optional) */
28
+ tenantId?: string;
29
+ /** Unique audit record identifier */
30
+ id: string | number;
31
+ /** Application that owns this audit record */
32
+ app: AnyApp;
33
+ /** Optional resource identifier within the application */
34
+ resourceId?: string | number;
35
+ /** Type of resource being audited */
36
+ resourceType: AnyResourceType;
37
+ };
38
+ /**
39
+ * Generic identifiers with typed App and ResourceType from config.
40
+ * @typeParam C - The audit config type for type inference
41
+ */
42
+ export type TypedIdentifiers<C extends AuditConfig> = {
43
+ /** Tenant/organization identifier for multi-tenancy support (optional) */
44
+ tenantId?: string;
45
+ /** Unique audit record identifier */
46
+ id: string | number;
47
+ /** Application that owns this audit record */
48
+ app: InferApp<C>;
49
+ /** Optional resource identifier within the application */
50
+ resourceId?: string | number;
51
+ /** Type of resource being audited */
52
+ resourceType: InferResourceType<C>;
53
+ };
54
+ /**
55
+ * Options for listing audit items by resource with typed App and ResourceType.
56
+ * @typeParam C - The audit config type for type inference
57
+ */
58
+ export type TypedListItemsOptions<C extends AuditConfig> = {
59
+ /** Tenant/organization identifier for multi-tenancy support (optional) */
60
+ tenantId?: string;
61
+ /** Resource identification */
62
+ resource: {
63
+ /** Type of the resource */
64
+ type: InferResourceType<C>;
65
+ /** Unique identifier of the resource */
66
+ id: string;
67
+ };
68
+ /** Application owning the resource */
69
+ app: InferApp<C>;
70
+ };
71
+ /**
72
+ * Options for listing audit items by trace ID with typed App and ResourceType.
73
+ * @typeParam C - The audit config type for type inference
74
+ */
75
+ export type TypedListTraceItems<C extends AuditConfig> = {
76
+ /** Tenant/organization identifier for multi-tenancy support (optional) */
77
+ tenantId?: string;
78
+ /** Trace ID to query for related audit records */
79
+ trace: string;
80
+ /** Optional application filter */
81
+ app?: InferApp<C>;
82
+ /** Optional resource filter */
83
+ resource?: {
84
+ /** Filter by resource type */
85
+ type?: InferResourceType<C>;
86
+ /** Filter by resource ID */
87
+ id?: string;
88
+ };
89
+ };
90
+ /**
91
+ * Repository for managing audit records in DynamoDB.
92
+ *
93
+ * Provides CRUD operations for audit records with support for:
94
+ * - Single item retrieval by identifiers
95
+ * - Batch upsert operations with automatic batching
96
+ * - Paginated listing by resource
97
+ * - Paginated listing by trace ID for distributed tracing
98
+ *
99
+ * The repository uses a single-table design with composite keys and
100
+ * multiple GSI/LSI indexes for efficient query patterns.
101
+ *
102
+ * @typeParam C - The audit config type for type inference
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const config = defineAuditConfig({
107
+ * apps: ['Orders', 'Inventory'] as const,
108
+ * resourceTypes: ['Order', 'Product'] as const,
109
+ * });
110
+ * const repository = new AuditRepository(logger, config);
111
+ *
112
+ * // Get a single audit record - typed!
113
+ * const audit = await repository.getItem({
114
+ * id: 'audit-123',
115
+ * app: 'Orders', // TypeScript knows valid values
116
+ * resourceType: 'Order', // Autocomplete works
117
+ * });
118
+ *
119
+ * // Upsert multiple audit records
120
+ * await repository.upsertBatch([
121
+ * { operation: 'createUser', status: 'success', ... },
122
+ * { operation: 'updateUser', status: 'success', ... },
123
+ * ]);
124
+ *
125
+ * // List audits for a specific resource
126
+ * const { items, pagination } = await repository.listItems({
127
+ * app: 'Orders',
128
+ * resource: { type: 'Order', id: 'user-123' },
129
+ * });
130
+ * ```
131
+ */
132
+ export declare class AuditRepository<C extends AuditConfig> {
133
+ private readonly logger;
134
+ private readonly config;
135
+ private readonly client;
136
+ /**
137
+ * Creates a new AuditRepository instance.
138
+ *
139
+ * @param logger - Logger instance for error reporting and debugging
140
+ * @param config - Audit configuration for type inference
141
+ * @param client - DynamoDB client (defaults to new instance with AWS_REGION from environment)
142
+ */
143
+ constructor(logger: Logger, config: C, client?: DynamoDBClient);
144
+ /**
145
+ * Retrieves a single audit record by its identifiers.
146
+ *
147
+ * Performs a DynamoDB GetItem operation using the constructed primary key.
148
+ * Returns undefined if the item is not found or if an error occurs.
149
+ *
150
+ * @param identifiers - Object containing id, app, and resourceType to locate the record
151
+ * @returns The audit record if found, undefined otherwise
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * const audit = await repository.getItem({
156
+ * id: 'audit-123',
157
+ * app: 'Orders',
158
+ * resourceType: 'Order',
159
+ * });
160
+ *
161
+ * if (audit) {
162
+ * console.log('Found audit:', audit.operation);
163
+ * }
164
+ * ```
165
+ */
166
+ getItem(identifiers: Omit<TypedIdentifiers<C>, "resourceId">): Promise<Audit | undefined>;
167
+ /**
168
+ * Upserts multiple audit records in batch.
169
+ *
170
+ * Performs a DynamoDB BatchWriteItem operation, automatically chunking
171
+ * items into batches of 25 (DynamoDB's maximum batch size).
172
+ * Each item is enriched with:
173
+ * - Primary keys (PK, SK)
174
+ * - Secondary index keys (GSI1_SS, GSI1_SN, LSI1_N)
175
+ * - TTL attribute (90 days from creation)
176
+ * - Timestamps (createdAt, updatedAt)
177
+ *
178
+ * @param items - Array of audit records to upsert
179
+ * @returns True when the operation completes (does not check for unprocessed items)
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * await repository.upsertBatch([
184
+ * {
185
+ * operation: 'createUser',
186
+ * status: 'success',
187
+ * tier: 2,
188
+ * target: { app: App.App1, type: ResourceType.USER, id: 'user-123' },
189
+ * },
190
+ * {
191
+ * operation: 'updateUser',
192
+ * status: 'success',
193
+ * tier: 2,
194
+ * target: { app: App.App1, type: ResourceType.USER, id: 'user-456' },
195
+ * },
196
+ * ]);
197
+ * ```
198
+ */
199
+ upsertBatch(items: Array<UpsertAuditInput>): Promise<boolean>;
200
+ /**
201
+ * Lists audit records for a specific resource with pagination.
202
+ *
203
+ * Queries the GSI1_SS index to efficiently retrieve all audits
204
+ * associated with a specific app/resource combination.
205
+ * Results are returned in reverse chronological order.
206
+ *
207
+ * @param params - Query parameters including app and resource identifiers
208
+ * @param pagination - Optional pagination settings (pageSize, nextToken)
209
+ * @returns Paginated collection of audit records
210
+ *
211
+ * @example
212
+ * ```typescript
213
+ * // Get first page
214
+ * const page1 = await repository.listItems({
215
+ * app: 'Orders',
216
+ * resource: { type: 'Order', id: 'user-123' },
217
+ * });
218
+ *
219
+ * // Get next page using the pagination token
220
+ * const page2 = await repository.listItems(
221
+ * { app: 'Orders', resource: { type: 'Order', id: 'user-123' } },
222
+ * { nextToken: page1.pagination?.nextToken },
223
+ * );
224
+ * ```
225
+ */
226
+ listItems(params: TypedListItemsOptions<C>, pagination?: Pagination): Promise<{
227
+ items: {
228
+ id: string;
229
+ status: "success" | "warn" | "fail" | "skip";
230
+ tier: number;
231
+ target: {
232
+ app: string;
233
+ type: string;
234
+ id?: string | number | undefined;
235
+ };
236
+ operation: string;
237
+ tenantId?: string | undefined;
238
+ source?: {
239
+ app: string;
240
+ type: string;
241
+ id?: string | number | undefined;
242
+ } | undefined;
243
+ context?: Record<string, string | number | boolean | {
244
+ [key: string]: string | number | boolean | /*elided*/ any;
245
+ }> | undefined;
246
+ message?: string | undefined;
247
+ rerunable?: boolean | undefined;
248
+ trace?: string | undefined;
249
+ event?: {
250
+ detail: string | undefined;
251
+ source?: string | undefined;
252
+ "detail-type"?: string | undefined;
253
+ } | undefined;
254
+ error?: any;
255
+ attempts?: {
256
+ number: number;
257
+ status: "success" | "warn" | "fail" | "skip";
258
+ at: string;
259
+ error?: any;
260
+ }[] | undefined;
261
+ }[];
262
+ pagination?: {
263
+ pageSize?: string | number | null | undefined;
264
+ nextToken?: string | null | undefined;
265
+ } | undefined;
266
+ }>;
267
+ /**
268
+ * Lists audit records by trace ID for distributed tracing.
269
+ *
270
+ * Queries the GSI1_SN index to retrieve all audits sharing
271
+ * the same trace ID, ordered by trace stage/depth.
272
+ * Supports optional filtering by app, resource type, and resource ID.
273
+ *
274
+ * This is useful for viewing the complete audit trail of a
275
+ * distributed operation across multiple services or resources.
276
+ *
277
+ * @param params - Query parameters including trace ID and optional filters
278
+ * @param pagination - Optional pagination settings (pageSize, nextToken)
279
+ * @returns Paginated collection of audit records in trace order
280
+ *
281
+ * @example
282
+ * ```typescript
283
+ * // Get all audits for a trace
284
+ * const trace = await repository.listTraceItems({
285
+ * trace: 'trace-abc-123',
286
+ * });
287
+ *
288
+ * // Filter by app and resource type
289
+ * const filtered = await repository.listTraceItems({
290
+ * trace: 'trace-abc-123',
291
+ * app: 'Orders',
292
+ * resource: { type: 'Order' },
293
+ * });
294
+ * ```
295
+ */
296
+ listTraceItems(params: TypedListTraceItems<C>, pagination?: Pagination): Promise<{
297
+ items: {
298
+ id: string;
299
+ status: "success" | "warn" | "fail" | "skip";
300
+ tier: number;
301
+ target: {
302
+ app: string;
303
+ type: string;
304
+ id?: string | number | undefined;
305
+ };
306
+ operation: string;
307
+ tenantId?: string | undefined;
308
+ source?: {
309
+ app: string;
310
+ type: string;
311
+ id?: string | number | undefined;
312
+ } | undefined;
313
+ context?: Record<string, string | number | boolean | {
314
+ [key: string]: string | number | boolean | /*elided*/ any;
315
+ }> | undefined;
316
+ message?: string | undefined;
317
+ rerunable?: boolean | undefined;
318
+ trace?: string | undefined;
319
+ event?: {
320
+ detail: string | undefined;
321
+ source?: string | undefined;
322
+ "detail-type"?: string | undefined;
323
+ } | undefined;
324
+ error?: any;
325
+ attempts?: {
326
+ number: number;
327
+ status: "success" | "warn" | "fail" | "skip";
328
+ at: string;
329
+ error?: any;
330
+ }[] | undefined;
331
+ }[];
332
+ pagination?: {
333
+ pageSize?: string | number | null | undefined;
334
+ nextToken?: string | null | undefined;
335
+ } | undefined;
336
+ }>;
337
+ /**
338
+ * Constructs the DynamoDB primary key from identifiers.
339
+ *
340
+ * When tenantId is provided, it prefixes the partition key for multi-tenant isolation.
341
+ *
342
+ * @param identifiers - Object containing tenantId (optional), app, id, and resourceType
343
+ * @returns Primary key object with PK and SK attributes
344
+ * @internal
345
+ */
346
+ private constructPrimaryKey;
347
+ /**
348
+ * Constructs all secondary index keys for an audit item.
349
+ *
350
+ * Includes:
351
+ * - LSI1_N: Tier-based sort key for priority ordering
352
+ * - GSI1_SS: Resource-based index keys
353
+ * - GSI1_SN: Trace-based index keys (if trace exists)
354
+ *
355
+ * @param item - The audit storage item
356
+ * @returns Object containing all secondary key attributes
357
+ * @internal
358
+ */
359
+ private constructSecondaryKeys;
360
+ /**
361
+ * Constructs GSI1_SS (String-String) index keys for resource-based queries.
362
+ *
363
+ * The partition key combines app, resourceType, and resourceId for
364
+ * efficient querying of all audits for a specific resource.
365
+ * When tenantId is provided, it prefixes the partition key for multi-tenant isolation.
366
+ *
367
+ * @param identifiers - Full identifiers including resourceId and optional tenantId
368
+ * @returns GSI1_SS key attributes
369
+ * @internal
370
+ */
371
+ private constructGSI1_SS;
372
+ /**
373
+ * Constructs GSI1_SN (String-Number) index keys for trace-based queries.
374
+ *
375
+ * Parses the trace string to extract the trace ID and stage number,
376
+ * enabling efficient querying of all audits in a distributed trace.
377
+ * When tenantId is provided, it prefixes the partition key for multi-tenant isolation.
378
+ *
379
+ * @param item - The audit storage item
380
+ * @returns GSI1_SN key attributes, or empty object if no trace
381
+ * @internal
382
+ */
383
+ private constructGSI1_SN;
384
+ /**
385
+ * Constructs the TTL attribute for automatic item expiration.
386
+ *
387
+ * @param ttlSeconds - Seconds until expiration (defaults to 90 days)
388
+ * @param date - Base date for TTL calculation (defaults to now)
389
+ * @returns TTL attribute with Unix timestamp in seconds
390
+ * @internal
391
+ */
392
+ private constructTTLAttribute;
393
+ /**
394
+ * Transforms a raw DynamoDB item into an Audit object.
395
+ *
396
+ * Reconstructs the trace string and extracts the clean ID
397
+ * from compound keys.
398
+ *
399
+ * @param item - Raw DynamoDB item with all keys
400
+ * @returns Parsed and validated Audit object
401
+ * @internal
402
+ */
403
+ private transformItem;
404
+ /**
405
+ * Transforms a trace listing item into an audit list item payload.
406
+ *
407
+ * @param item - Raw trace listing item from GSI1_SN query
408
+ * @returns Parsed audit list item payload
409
+ * @internal
410
+ */
411
+ private transformTraceListItem;
412
+ /**
413
+ * Transforms a resource listing item into an audit list item payload.
414
+ *
415
+ * @param item - Raw listing item from GSI1_SS query
416
+ * @returns Parsed audit list item payload
417
+ * @internal
418
+ */
419
+ private transformListItem;
420
+ }
421
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}