@axova/shared 1.0.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 (112) hide show
  1. package/CONFIGURATION_GUIDE.md +1 -0
  2. package/README.md +384 -0
  3. package/SCHEMA_ORGANIZATION.md +209 -0
  4. package/dist/configs/index.d.ts +85 -0
  5. package/dist/configs/index.js +555 -0
  6. package/dist/events/kafka.d.ts +40 -0
  7. package/dist/events/kafka.js +311 -0
  8. package/dist/index.d.ts +13 -0
  9. package/dist/index.js +41 -0
  10. package/dist/interfaces/customer-events.d.ts +85 -0
  11. package/dist/interfaces/customer-events.js +2 -0
  12. package/dist/interfaces/inventory-events.d.ts +453 -0
  13. package/dist/interfaces/inventory-events.js +3 -0
  14. package/dist/interfaces/inventory-types.d.ts +894 -0
  15. package/dist/interfaces/inventory-types.js +3 -0
  16. package/dist/interfaces/order-events.d.ts +320 -0
  17. package/dist/interfaces/order-events.js +3 -0
  18. package/dist/lib/auditLogger.d.ts +162 -0
  19. package/dist/lib/auditLogger.js +626 -0
  20. package/dist/lib/authOrganization.d.ts +24 -0
  21. package/dist/lib/authOrganization.js +110 -0
  22. package/dist/lib/db.d.ts +6 -0
  23. package/dist/lib/db.js +88 -0
  24. package/dist/middleware/serviceAuth.d.ts +60 -0
  25. package/dist/middleware/serviceAuth.js +272 -0
  26. package/dist/middleware/storeOwnership.d.ts +15 -0
  27. package/dist/middleware/storeOwnership.js +156 -0
  28. package/dist/middleware/storeValidationMiddleware.d.ts +44 -0
  29. package/dist/middleware/storeValidationMiddleware.js +180 -0
  30. package/dist/middleware/userAuth.d.ts +27 -0
  31. package/dist/middleware/userAuth.js +218 -0
  32. package/dist/schemas/admin/admin-schema.d.ts +741 -0
  33. package/dist/schemas/admin/admin-schema.js +111 -0
  34. package/dist/schemas/ai-moderation/ai-moderation-schema.d.ts +648 -0
  35. package/dist/schemas/ai-moderation/ai-moderation-schema.js +88 -0
  36. package/dist/schemas/common/common-schemas.d.ts +436 -0
  37. package/dist/schemas/common/common-schemas.js +94 -0
  38. package/dist/schemas/compliance/compliance-schema.d.ts +3388 -0
  39. package/dist/schemas/compliance/compliance-schema.js +472 -0
  40. package/dist/schemas/compliance/kyc-schema.d.ts +2642 -0
  41. package/dist/schemas/compliance/kyc-schema.js +361 -0
  42. package/dist/schemas/customer/customer-schema.d.ts +2727 -0
  43. package/dist/schemas/customer/customer-schema.js +399 -0
  44. package/dist/schemas/index.d.ts +27 -0
  45. package/dist/schemas/index.js +138 -0
  46. package/dist/schemas/inventory/inventory-tables.d.ts +9476 -0
  47. package/dist/schemas/inventory/inventory-tables.js +1470 -0
  48. package/dist/schemas/inventory/lot-tables.d.ts +3281 -0
  49. package/dist/schemas/inventory/lot-tables.js +608 -0
  50. package/dist/schemas/order/order-schema.d.ts +5825 -0
  51. package/dist/schemas/order/order-schema.js +954 -0
  52. package/dist/schemas/product/discount-relations.d.ts +15 -0
  53. package/dist/schemas/product/discount-relations.js +34 -0
  54. package/dist/schemas/product/discount-schema.d.ts +1975 -0
  55. package/dist/schemas/product/discount-schema.js +297 -0
  56. package/dist/schemas/product/product-relations.d.ts +41 -0
  57. package/dist/schemas/product/product-relations.js +133 -0
  58. package/dist/schemas/product/product-schema.d.ts +4544 -0
  59. package/dist/schemas/product/product-schema.js +671 -0
  60. package/dist/schemas/store/store-audit-schema.d.ts +4135 -0
  61. package/dist/schemas/store/store-audit-schema.js +556 -0
  62. package/dist/schemas/store/store-schema.d.ts +3100 -0
  63. package/dist/schemas/store/store-schema.js +381 -0
  64. package/dist/schemas/store/store-settings-schema.d.ts +665 -0
  65. package/dist/schemas/store/store-settings-schema.js +141 -0
  66. package/dist/schemas/types.d.ts +50 -0
  67. package/dist/schemas/types.js +3 -0
  68. package/dist/types/events.d.ts +2396 -0
  69. package/dist/types/events.js +505 -0
  70. package/dist/utils/errorHandler.d.ts +12 -0
  71. package/dist/utils/errorHandler.js +36 -0
  72. package/dist/utils/subdomain.d.ts +6 -0
  73. package/dist/utils/subdomain.js +20 -0
  74. package/nul +8 -0
  75. package/package.json +43 -0
  76. package/src/configs/index.ts +654 -0
  77. package/src/events/kafka.ts +429 -0
  78. package/src/index.ts +26 -0
  79. package/src/interfaces/customer-events.ts +106 -0
  80. package/src/interfaces/inventory-events.ts +545 -0
  81. package/src/interfaces/inventory-types.ts +1004 -0
  82. package/src/interfaces/order-events.ts +381 -0
  83. package/src/lib/auditLogger.ts +1117 -0
  84. package/src/lib/authOrganization.ts +153 -0
  85. package/src/lib/db.ts +64 -0
  86. package/src/middleware/serviceAuth.ts +328 -0
  87. package/src/middleware/storeOwnership.ts +199 -0
  88. package/src/middleware/storeValidationMiddleware.ts +247 -0
  89. package/src/middleware/userAuth.ts +248 -0
  90. package/src/schemas/admin/admin-schema.ts +208 -0
  91. package/src/schemas/ai-moderation/ai-moderation-schema.ts +180 -0
  92. package/src/schemas/common/common-schemas.ts +108 -0
  93. package/src/schemas/compliance/compliance-schema.ts +927 -0
  94. package/src/schemas/compliance/kyc-schema.ts +649 -0
  95. package/src/schemas/customer/customer-schema.ts +576 -0
  96. package/src/schemas/index.ts +189 -0
  97. package/src/schemas/inventory/inventory-tables.ts +1927 -0
  98. package/src/schemas/inventory/lot-tables.ts +799 -0
  99. package/src/schemas/order/order-schema.ts +1400 -0
  100. package/src/schemas/product/discount-relations.ts +44 -0
  101. package/src/schemas/product/discount-schema.ts +464 -0
  102. package/src/schemas/product/product-relations.ts +187 -0
  103. package/src/schemas/product/product-schema.ts +955 -0
  104. package/src/schemas/store/ethiopian_business_api.md.resolved +212 -0
  105. package/src/schemas/store/store-audit-schema.ts +1257 -0
  106. package/src/schemas/store/store-schema.ts +661 -0
  107. package/src/schemas/store/store-settings-schema.ts +231 -0
  108. package/src/schemas/types.ts +67 -0
  109. package/src/types/events.ts +646 -0
  110. package/src/utils/errorHandler.ts +44 -0
  111. package/src/utils/subdomain.ts +19 -0
  112. package/tsconfig.json +21 -0
@@ -0,0 +1,556 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STORE_AUDIT_BUSINESS_RULES = exports.storeAuditRelations = exports.storeAuditTrails = exports.storeAuditAggregations = exports.storeAuditLogs = void 0;
4
+ const cuid2_1 = require("@paralleldrive/cuid2");
5
+ const drizzle_orm_1 = require("drizzle-orm");
6
+ const pg_core_1 = require("drizzle-orm/pg-core");
7
+ // =====================================================
8
+ // STORE AUDIT LOGS - COMPREHENSIVE TRACKING SYSTEM
9
+ // =====================================================
10
+ /**
11
+ * Primary Store Audit Logs Table
12
+ * Immutable, append-only design for complete store operation tracking
13
+ * Optimized for high-volume insertions with comprehensive indexing
14
+ */
15
+ exports.storeAuditLogs = (0, pg_core_1.pgTable)("store_audit_logs", {
16
+ // Primary Identification
17
+ id: (0, pg_core_1.text)("id")
18
+ .primaryKey()
19
+ .$defaultFn(() => (0, cuid2_1.createId)()),
20
+ // Store Context - Core Business Entity
21
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
22
+ storeName: (0, pg_core_1.varchar)("store_name", { length: 255 }),
23
+ storeSubdomain: (0, pg_core_1.varchar)("store_subdomain", { length: 63 }),
24
+ storeUrl: (0, pg_core_1.varchar)("store_url", { length: 255 }),
25
+ // Event Classification - Enhanced Categorization
26
+ eventType: (0, pg_core_1.varchar)("event_type", { length: 30 })
27
+ .notNull()
28
+ .$type(),
29
+ eventCategory: (0, pg_core_1.varchar)("event_category", { length: 30 })
30
+ .notNull()
31
+ .$type(),
32
+ // Action Details - Comprehensive Operation Tracking
33
+ action: (0, pg_core_1.varchar)("action", { length: 100 }).notNull(),
34
+ actionDescription: (0, pg_core_1.text)("action_description"),
35
+ // Resource Information - What Was Affected
36
+ resource: (0, pg_core_1.varchar)("resource", { length: 100 }).notNull(),
37
+ resourceId: (0, pg_core_1.text)("resource_id").notNull(),
38
+ resourceType: (0, pg_core_1.varchar)("resource_type", { length: 30 }).$type(),
39
+ resourceName: (0, pg_core_1.varchar)("resource_name", { length: 255 }),
40
+ parentResourceId: (0, pg_core_1.text)("parent_resource_id"),
41
+ parentResourceType: (0, pg_core_1.varchar)("parent_resource_type", { length: 30 }),
42
+ // Actor Information - Who Performed the Action
43
+ performedBy: (0, pg_core_1.text)("performed_by").notNull(),
44
+ performedByType: (0, pg_core_1.varchar)("performed_by_type", { length: 20 })
45
+ .notNull()
46
+ .$type(),
47
+ performedByName: (0, pg_core_1.varchar)("performed_by_name", { length: 255 }),
48
+ performedByEmail: (0, pg_core_1.varchar)("performed_by_email", { length: 320 }),
49
+ // User Role and Permissions Context
50
+ userRole: (0, pg_core_1.varchar)("user_role", { length: 50 }).$type(),
51
+ userPermissions: (0, pg_core_1.jsonb)("user_permissions").$type().default([]),
52
+ // Session and Request Context
53
+ sessionId: (0, pg_core_1.text)("session_id"),
54
+ requestId: (0, pg_core_1.text)("request_id"),
55
+ correlationId: (0, pg_core_1.text)("correlation_id"),
56
+ traceId: (0, pg_core_1.text)("trace_id"),
57
+ spanId: (0, pg_core_1.text)("span_id"),
58
+ // Network and Client Information
59
+ ipAddress: (0, pg_core_1.varchar)("ip_address", { length: 45 }), // IPv6 support
60
+ userAgent: (0, pg_core_1.text)("user_agent"),
61
+ clientType: (0, pg_core_1.varchar)("client_type", { length: 30 }).$type(),
62
+ clientId: (0, pg_core_1.text)("client_id"),
63
+ clientVersion: (0, pg_core_1.varchar)("client_version", { length: 50 }),
64
+ clientPlatform: (0, pg_core_1.varchar)("client_platform", { length: 50 }),
65
+ // Device Information
66
+ deviceInfo: (0, pg_core_1.jsonb)("device_info").$type(),
67
+ // Geographic Information
68
+ location: (0, pg_core_1.jsonb)("location").$type(),
69
+ // HTTP Context
70
+ httpMethod: (0, pg_core_1.varchar)("http_method", { length: 10 }),
71
+ httpPath: (0, pg_core_1.text)("http_path"),
72
+ httpQuery: (0, pg_core_1.text)("http_query"),
73
+ httpHeaders: (0, pg_core_1.jsonb)("http_headers").$type(),
74
+ httpStatusCode: (0, pg_core_1.integer)("http_status_code"),
75
+ httpResponseSize: (0, pg_core_1.integer)("http_response_size"),
76
+ // Data Changes and Content
77
+ changes: (0, pg_core_1.jsonb)("changes").$type(),
78
+ // Request/Response Data (Sanitized)
79
+ requestData: (0, pg_core_1.jsonb)("request_data").$type(),
80
+ responseData: (0, pg_core_1.jsonb)("response_data").$type(),
81
+ // Business Context and Metadata
82
+ businessContext: (0, pg_core_1.jsonb)("business_context").$type(),
83
+ // Enhanced Metadata
84
+ metadata: (0, pg_core_1.jsonb)("metadata").$type(),
85
+ // Performance Metrics
86
+ duration: (0, pg_core_1.integer)("duration"), // milliseconds
87
+ responseTime: (0, pg_core_1.integer)("response_time"), // milliseconds
88
+ processingTime: (0, pg_core_1.integer)("processing_time"), // milliseconds
89
+ databaseTime: (0, pg_core_1.integer)("database_time"), // milliseconds
90
+ cacheHitRate: (0, pg_core_1.real)("cache_hit_rate"), // percentage
91
+ memoryUsage: (0, pg_core_1.integer)("memory_usage"), // bytes
92
+ cpuUsage: (0, pg_core_1.real)("cpu_usage"), // percentage
93
+ // Operation Success and Error Information
94
+ success: (0, pg_core_1.boolean)("success").notNull().default(true),
95
+ errorCode: (0, pg_core_1.varchar)("error_code", { length: 100 }),
96
+ errorMessage: (0, pg_core_1.text)("error_message"),
97
+ errorType: (0, pg_core_1.varchar)("error_type", { length: 50 }).$type(),
98
+ errorDetails: (0, pg_core_1.jsonb)("error_details").$type(),
99
+ stackTrace: (0, pg_core_1.text)("stack_trace"),
100
+ // Recovery and Retry Information
101
+ retryCount: (0, pg_core_1.integer)("retry_count").default(0),
102
+ recoveryAction: (0, pg_core_1.varchar)("recovery_action", { length: 100 }),
103
+ fallbackUsed: (0, pg_core_1.boolean)("fallback_used").default(false),
104
+ // Security and Compliance
105
+ sensitiveData: (0, pg_core_1.boolean)("sensitive_data").notNull().default(false),
106
+ piiInvolved: (0, pg_core_1.boolean)("pii_involved").notNull().default(false),
107
+ complianceRelevant: (0, pg_core_1.boolean)("compliance_relevant").notNull().default(false),
108
+ dataClassification: (0, pg_core_1.varchar)("data_classification", { length: 20 })
109
+ .$type()
110
+ .default("INTERNAL"),
111
+ // Risk Assessment
112
+ riskLevel: (0, pg_core_1.varchar)("risk_level", { length: 20 })
113
+ .$type()
114
+ .default("LOW"),
115
+ securityImpact: (0, pg_core_1.varchar)("security_impact", { length: 20 })
116
+ .$type()
117
+ .default("NONE"),
118
+ privacyImpact: (0, pg_core_1.varchar)("privacy_impact", { length: 20 })
119
+ .$type()
120
+ .default("NONE"),
121
+ // Threat Detection
122
+ threatIndicators: (0, pg_core_1.jsonb)("threat_indicators")
123
+ .$type()
124
+ .default([]),
125
+ anomalyScore: (0, pg_core_1.real)("anomaly_score"), // 0-1 scale
126
+ fraudScore: (0, pg_core_1.real)("fraud_score"), // 0-1 scale
127
+ // Compliance Framework Tracking
128
+ complianceFrameworks: (0, pg_core_1.jsonb)("compliance_frameworks")
129
+ .$type()
130
+ .default([]),
131
+ // Data Lifecycle
132
+ retentionPeriod: (0, pg_core_1.integer)("retention_period"), // days
133
+ archiveDate: (0, pg_core_1.timestamp)("archive_date", { withTimezone: true }),
134
+ purgeDate: (0, pg_core_1.timestamp)("purge_date", { withTimezone: true }),
135
+ // Workflow and Process Tracking
136
+ workflowId: (0, pg_core_1.text)("workflow_id"),
137
+ workflowStep: (0, pg_core_1.varchar)("workflow_step", { length: 100 }),
138
+ workflowStatus: (0, pg_core_1.varchar)("workflow_status", { length: 30 }).$type(),
139
+ parentEventId: (0, pg_core_1.text)("parent_event_id"),
140
+ childEventIds: (0, pg_core_1.jsonb)("child_event_ids").$type().default([]),
141
+ // Batch and Bulk Operations
142
+ batchId: (0, pg_core_1.text)("batch_id"),
143
+ batchSize: (0, pg_core_1.integer)("batch_size"),
144
+ batchIndex: (0, pg_core_1.integer)("batch_index"),
145
+ isBulkOperation: (0, pg_core_1.boolean)("is_bulk_operation").default(false),
146
+ // Integration and External Systems
147
+ externalSystemId: (0, pg_core_1.text)("external_system_id"),
148
+ externalSystemName: (0, pg_core_1.varchar)("external_system_name", { length: 100 }),
149
+ externalEventId: (0, pg_core_1.text)("external_event_id"),
150
+ syncStatus: (0, pg_core_1.varchar)("sync_status", { length: 20 }).$type(),
151
+ // Notification and Alerting
152
+ alertLevel: (0, pg_core_1.varchar)("alert_level", { length: 20 })
153
+ .$type()
154
+ .default("NONE"),
155
+ notificationsSent: (0, pg_core_1.jsonb)("notifications_sent")
156
+ .$type()
157
+ .default([]),
158
+ // Data Integrity and Verification
159
+ checksum: (0, pg_core_1.varchar)("checksum", { length: 64 }), // SHA-256
160
+ signature: (0, pg_core_1.text)("signature"), // Digital signature for critical events
161
+ verified: (0, pg_core_1.boolean)("verified").default(false),
162
+ // Immutable Timestamp - Core Audit Requirement
163
+ timestamp: (0, pg_core_1.timestamp)("timestamp", { withTimezone: true })
164
+ .defaultNow()
165
+ .notNull(),
166
+ // Processing Timestamps
167
+ processedAt: (0, pg_core_1.timestamp)("processed_at", { withTimezone: true }),
168
+ indexedAt: (0, pg_core_1.timestamp)("indexed_at", { withTimezone: true }),
169
+ // Export and Reporting
170
+ exportedAt: (0, pg_core_1.timestamp)("exported_at", { withTimezone: true }),
171
+ reportingPeriod: (0, pg_core_1.varchar)("reporting_period", { length: 20 }),
172
+ // System Information
173
+ serviceVersion: (0, pg_core_1.varchar)("service_version", { length: 50 }),
174
+ nodeId: (0, pg_core_1.varchar)("node_id", { length: 100 }),
175
+ instanceId: (0, pg_core_1.varchar)("instance_id", { length: 100 }),
176
+ }, (table) => ({
177
+ // === PRIMARY PERFORMANCE INDEXES ===
178
+ // Core timestamp index - most important for audit queries
179
+ timestampIndex: (0, pg_core_1.index)("idx_store_audit_timestamp").on(table.timestamp),
180
+ // Store-centric indexes for business queries
181
+ storeIdIndex: (0, pg_core_1.index)("idx_store_audit_store_id").on(table.storeId),
182
+ storeTimestampIndex: (0, pg_core_1.index)("idx_store_audit_store_timestamp").on(table.storeId, table.timestamp),
183
+ // Event classification indexes
184
+ eventTypeIndex: (0, pg_core_1.index)("idx_store_audit_event_type").on(table.eventType, table.eventCategory),
185
+ actionIndex: (0, pg_core_1.index)("idx_store_audit_action").on(table.action),
186
+ // Resource tracking indexes
187
+ resourceIndex: (0, pg_core_1.index)("idx_store_audit_resource").on(table.resource, table.resourceId),
188
+ resourceTypeIndex: (0, pg_core_1.index)("idx_store_audit_resource_type").on(table.resourceType, table.timestamp),
189
+ // Actor and user tracking
190
+ performedByIndex: (0, pg_core_1.index)("idx_store_audit_performed_by").on(table.performedBy, table.performedByType),
191
+ userRoleIndex: (0, pg_core_1.index)("idx_store_audit_user_role").on(table.userRole, table.timestamp),
192
+ // === SECURITY AND COMPLIANCE INDEXES ===
193
+ // Security monitoring
194
+ securityIndex: (0, pg_core_1.index)("idx_store_audit_security").on(table.riskLevel, table.securityImpact, table.timestamp),
195
+ threatIndex: (0, pg_core_1.index)("idx_store_audit_threats").on(table.anomalyScore, table.fraudScore, table.timestamp),
196
+ // Compliance tracking
197
+ complianceIndex: (0, pg_core_1.index)("idx_store_audit_compliance").on(table.complianceRelevant, table.piiInvolved, table.sensitiveData),
198
+ dataClassificationIndex: (0, pg_core_1.index)("idx_store_audit_data_classification").on(table.dataClassification, table.timestamp),
199
+ // === OPERATIONAL INDEXES ===
200
+ // Error and success tracking
201
+ errorIndex: (0, pg_core_1.index)("idx_store_audit_errors").on(table.success, table.errorCode, table.timestamp),
202
+ errorTypeIndex: (0, pg_core_1.index)("idx_store_audit_error_type").on(table.errorType, table.timestamp),
203
+ // Performance monitoring
204
+ performanceIndex: (0, pg_core_1.index)("idx_store_audit_performance").on(table.duration, table.responseTime, table.timestamp),
205
+ // Session and correlation tracking
206
+ sessionIndex: (0, pg_core_1.index)("idx_store_audit_session").on(table.sessionId, table.timestamp),
207
+ correlationIndex: (0, pg_core_1.index)("idx_store_audit_correlation").on(table.correlationId),
208
+ requestIndex: (0, pg_core_1.index)("idx_store_audit_request").on(table.requestId),
209
+ // === BUSINESS INTELLIGENCE INDEXES ===
210
+ // Client and device analytics
211
+ clientTypeIndex: (0, pg_core_1.index)("idx_store_audit_client_type").on(table.clientType, table.timestamp),
212
+ userAgentIndex: (0, pg_core_1.index)("idx_store_audit_user_agent").on(table.userAgent),
213
+ // Geographic analytics
214
+ locationIndex: (0, pg_core_1.index)("idx_store_audit_location").on(table.ipAddress, table.timestamp),
215
+ // HTTP tracking
216
+ httpMethodIndex: (0, pg_core_1.index)("idx_store_audit_http_method").on(table.httpMethod, table.httpStatusCode),
217
+ // === WORKFLOW AND PROCESS INDEXES ===
218
+ // Workflow tracking
219
+ workflowIndex: (0, pg_core_1.index)("idx_store_audit_workflow").on(table.workflowId, table.workflowStep, table.timestamp),
220
+ parentEventIndex: (0, pg_core_1.index)("idx_store_audit_parent_event").on(table.parentEventId),
221
+ // Batch operations
222
+ batchIndex: (0, pg_core_1.index)("idx_store_audit_batch").on(table.batchId, table.batchIndex),
223
+ bulkOperationIndex: (0, pg_core_1.index)("idx_store_audit_bulk").on(table.isBulkOperation, table.timestamp),
224
+ // === INTEGRATION INDEXES ===
225
+ // External system tracking
226
+ externalSystemIndex: (0, pg_core_1.index)("idx_store_audit_external_system").on(table.externalSystemId, table.syncStatus),
227
+ // Notification tracking
228
+ alertLevelIndex: (0, pg_core_1.index)("idx_store_audit_alert_level").on(table.alertLevel, table.timestamp),
229
+ // === COMPOSITE BUSINESS INDEXES ===
230
+ // Store activity analysis
231
+ storeActivityIndex: (0, pg_core_1.index)("idx_store_audit_store_activity").on(table.storeId, table.eventType, table.success, table.timestamp),
232
+ // User activity patterns
233
+ userActivityIndex: (0, pg_core_1.index)("idx_store_audit_user_activity").on(table.performedBy, table.storeId, table.timestamp),
234
+ // Security events by store
235
+ storeSecurityIndex: (0, pg_core_1.index)("idx_store_audit_store_security").on(table.storeId, table.riskLevel, table.securityImpact, table.timestamp),
236
+ // Resource changes by store
237
+ storeResourceIndex: (0, pg_core_1.index)("idx_store_audit_store_resource").on(table.storeId, table.resourceType, table.eventType, table.timestamp),
238
+ // Error patterns by store
239
+ storeErrorIndex: (0, pg_core_1.index)("idx_store_audit_store_errors").on(table.storeId, table.success, table.errorType, table.timestamp),
240
+ // === DATA LIFECYCLE INDEXES ===
241
+ // Retention and archival
242
+ retentionIndex: (0, pg_core_1.index)("idx_store_audit_retention").on(table.retentionPeriod, table.timestamp),
243
+ archiveIndex: (0, pg_core_1.index)("idx_store_audit_archive").on(table.archiveDate),
244
+ purgeIndex: (0, pg_core_1.index)("idx_store_audit_purge").on(table.purgeDate),
245
+ // Data integrity
246
+ checksumIndex: (0, pg_core_1.index)("idx_store_audit_checksum").on(table.checksum),
247
+ verificationIndex: (0, pg_core_1.index)("idx_store_audit_verified").on(table.verified, table.timestamp),
248
+ // === REPORTING INDEXES ===
249
+ // Note: Time-based reporting indexes with date_trunc functions
250
+ // can be added manually after table creation if needed for advanced analytics
251
+ }));
252
+ // =====================================================
253
+ // STORE AUDIT AGGREGATIONS - PERFORMANCE OPTIMIZATION
254
+ // =====================================================
255
+ /**
256
+ * Pre-computed Store Audit Aggregations
257
+ * For high-performance analytics and reporting
258
+ */
259
+ exports.storeAuditAggregations = (0, pg_core_1.pgTable)("store_audit_aggregations", {
260
+ id: (0, pg_core_1.text)("id")
261
+ .primaryKey()
262
+ .$defaultFn(() => (0, cuid2_1.createId)()),
263
+ // Aggregation Dimensions
264
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
265
+ aggregationType: (0, pg_core_1.varchar)("aggregation_type", { length: 20 })
266
+ .notNull()
267
+ .$type(),
268
+ aggregationDate: (0, pg_core_1.timestamp)("aggregation_date", {
269
+ withTimezone: true,
270
+ }).notNull(),
271
+ periodStart: (0, pg_core_1.timestamp)("period_start", { withTimezone: true }).notNull(),
272
+ periodEnd: (0, pg_core_1.timestamp)("period_end", { withTimezone: true }).notNull(),
273
+ // Dimensional Breakdowns
274
+ eventType: (0, pg_core_1.varchar)("event_type", { length: 30 }),
275
+ eventCategory: (0, pg_core_1.varchar)("event_category", { length: 30 }),
276
+ resourceType: (0, pg_core_1.varchar)("resource_type", { length: 30 }),
277
+ performedByType: (0, pg_core_1.varchar)("performed_by_type", { length: 20 }),
278
+ clientType: (0, pg_core_1.varchar)("client_type", { length: 30 }),
279
+ userRole: (0, pg_core_1.varchar)("user_role", { length: 50 }),
280
+ // Core Activity Metrics
281
+ totalEvents: (0, pg_core_1.integer)("total_events").notNull().default(0),
282
+ successfulEvents: (0, pg_core_1.integer)("successful_events").notNull().default(0),
283
+ failedEvents: (0, pg_core_1.integer)("failed_events").notNull().default(0),
284
+ uniqueUsers: (0, pg_core_1.integer)("unique_users").notNull().default(0),
285
+ uniqueResources: (0, pg_core_1.integer)("unique_resources").notNull().default(0),
286
+ uniqueIPs: (0, pg_core_1.integer)("unique_ips").notNull().default(0),
287
+ uniqueSessions: (0, pg_core_1.integer)("unique_sessions").notNull().default(0),
288
+ // Performance Metrics
289
+ avgDuration: (0, pg_core_1.real)("avg_duration"),
290
+ maxDuration: (0, pg_core_1.integer)("max_duration"),
291
+ minDuration: (0, pg_core_1.integer)("min_duration"),
292
+ p95Duration: (0, pg_core_1.integer)("p95_duration"),
293
+ p99Duration: (0, pg_core_1.integer)("p99_duration"),
294
+ avgResponseTime: (0, pg_core_1.real)("avg_response_time"),
295
+ maxResponseTime: (0, pg_core_1.integer)("max_response_time"),
296
+ p95ResponseTime: (0, pg_core_1.integer)("p95_response_time"),
297
+ totalDataTransferred: (0, pg_core_1.integer)("total_data_transferred"),
298
+ avgMemoryUsage: (0, pg_core_1.real)("avg_memory_usage"),
299
+ maxMemoryUsage: (0, pg_core_1.integer)("max_memory_usage"),
300
+ avgCpuUsage: (0, pg_core_1.real)("avg_cpu_usage"),
301
+ // Security and Risk Metrics
302
+ securityEvents: (0, pg_core_1.integer)("security_events").notNull().default(0),
303
+ highRiskEvents: (0, pg_core_1.integer)("high_risk_events").notNull().default(0),
304
+ criticalEvents: (0, pg_core_1.integer)("critical_events").notNull().default(0),
305
+ anomalousEvents: (0, pg_core_1.integer)("anomalous_events").notNull().default(0),
306
+ fraudulentEvents: (0, pg_core_1.integer)("fraudulent_events").notNull().default(0),
307
+ avgAnomalyScore: (0, pg_core_1.real)("avg_anomaly_score"),
308
+ maxAnomalyScore: (0, pg_core_1.real)("max_anomaly_score"),
309
+ avgFraudScore: (0, pg_core_1.real)("avg_fraud_score"),
310
+ maxFraudScore: (0, pg_core_1.real)("max_fraud_score"),
311
+ // Compliance Metrics
312
+ complianceEvents: (0, pg_core_1.integer)("compliance_events").notNull().default(0),
313
+ piiEvents: (0, pg_core_1.integer)("pii_events").notNull().default(0),
314
+ sensitiveDataEvents: (0, pg_core_1.integer)("sensitive_data_events").notNull().default(0),
315
+ complianceViolations: (0, pg_core_1.integer)("compliance_violations").notNull().default(0),
316
+ // Business Metrics
317
+ businessCriticalEvents: (0, pg_core_1.integer)("business_critical_events")
318
+ .notNull()
319
+ .default(0),
320
+ revenueImpactEvents: (0, pg_core_1.integer)("revenue_impact_events").notNull().default(0),
321
+ customerImpactEvents: (0, pg_core_1.integer)("customer_impact_events")
322
+ .notNull()
323
+ .default(0),
324
+ // Error Analysis
325
+ errorBreakdown: (0, pg_core_1.jsonb)("error_breakdown")
326
+ .$type()
327
+ .default({}),
328
+ topErrors: (0, pg_core_1.jsonb)("top_errors")
329
+ .$type()
330
+ .default([]),
331
+ // User Behavior Analytics
332
+ topUsers: (0, pg_core_1.jsonb)("top_users")
333
+ .$type()
334
+ .default([]),
335
+ // Resource Activity
336
+ topResources: (0, pg_core_1.jsonb)("top_resources")
337
+ .$type()
338
+ .default([]),
339
+ // Geographic Distribution
340
+ topCountries: (0, pg_core_1.jsonb)("top_countries")
341
+ .$type()
342
+ .default([]),
343
+ topCities: (0, pg_core_1.jsonb)("top_cities")
344
+ .$type()
345
+ .default([]),
346
+ // Technology Analytics
347
+ deviceBreakdown: (0, pg_core_1.jsonb)("device_breakdown")
348
+ .$type()
349
+ .default({}),
350
+ browserBreakdown: (0, pg_core_1.jsonb)("browser_breakdown")
351
+ .$type()
352
+ .default({}),
353
+ osBreakdown: (0, pg_core_1.jsonb)("os_breakdown")
354
+ .$type()
355
+ .default({}),
356
+ // Traffic Patterns
357
+ hourlyDistribution: (0, pg_core_1.jsonb)("hourly_distribution")
358
+ .$type()
359
+ .default({}),
360
+ peakHour: (0, pg_core_1.integer)("peak_hour"),
361
+ peakHourEvents: (0, pg_core_1.integer)("peak_hour_events"),
362
+ // Growth and Trends
363
+ periodOverPeriodGrowth: (0, pg_core_1.real)("period_over_period_growth"),
364
+ trendDirection: (0, pg_core_1.varchar)("trend_direction", { length: 10 }).$type(),
365
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
366
+ .defaultNow()
367
+ .notNull(),
368
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
369
+ .defaultNow()
370
+ .notNull(),
371
+ }, (table) => ({
372
+ // Primary aggregation indexes
373
+ storeAggregationIndex: (0, pg_core_1.index)("idx_store_audit_agg_store").on(table.storeId, table.aggregationType, table.aggregationDate),
374
+ aggregationDateIndex: (0, pg_core_1.index)("idx_store_audit_agg_date").on(table.aggregationDate, table.aggregationType),
375
+ // Dimensional analysis indexes
376
+ eventTypeAggIndex: (0, pg_core_1.index)("idx_store_audit_agg_event_type").on(table.eventType, table.aggregationDate),
377
+ // Performance monitoring
378
+ performanceAggIndex: (0, pg_core_1.index)("idx_store_audit_agg_performance").on(table.avgDuration, table.p95Duration, table.aggregationDate),
379
+ // Security analytics
380
+ securityAggIndex: (0, pg_core_1.index)("idx_store_audit_agg_security").on(table.securityEvents, table.highRiskEvents, table.aggregationDate),
381
+ }));
382
+ // =====================================================
383
+ // STORE AUDIT TRAILS - BUSINESS PROCESS TRACKING
384
+ // =====================================================
385
+ /**
386
+ * Store-Specific Audit Trails
387
+ * For tracking complex business processes and workflows
388
+ */
389
+ exports.storeAuditTrails = (0, pg_core_1.pgTable)("store_audit_trails", {
390
+ id: (0, pg_core_1.text)("id")
391
+ .primaryKey()
392
+ .$defaultFn(() => (0, cuid2_1.createId)()),
393
+ // Store Context
394
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
395
+ // Trail Information
396
+ trailName: (0, pg_core_1.varchar)("trail_name", { length: 100 }).notNull(),
397
+ trailType: (0, pg_core_1.varchar)("trail_type", { length: 30 })
398
+ .notNull()
399
+ .$type(),
400
+ trailDescription: (0, pg_core_1.text)("trail_description"),
401
+ // Subject/Target Information
402
+ subjectType: (0, pg_core_1.varchar)("subject_type", { length: 30 }).$type(),
403
+ subjectId: (0, pg_core_1.text)("subject_id").notNull(),
404
+ subjectName: (0, pg_core_1.varchar)("subject_name", { length: 255 }),
405
+ // Trail Status and Lifecycle
406
+ status: (0, pg_core_1.varchar)("status", { length: 20 })
407
+ .notNull()
408
+ .default("ACTIVE")
409
+ .$type(),
410
+ // Timeline
411
+ startedAt: (0, pg_core_1.timestamp)("started_at", { withTimezone: true }).notNull(),
412
+ completedAt: (0, pg_core_1.timestamp)("completed_at", { withTimezone: true }),
413
+ estimatedCompletionAt: (0, pg_core_1.timestamp)("estimated_completion_at", {
414
+ withTimezone: true,
415
+ }),
416
+ // Ownership and Responsibility
417
+ ownerId: (0, pg_core_1.text)("owner_id"),
418
+ ownerName: (0, pg_core_1.varchar)("owner_name", { length: 255 }),
419
+ ownerType: (0, pg_core_1.varchar)("owner_type", { length: 20 }).$type(),
420
+ assignedTo: (0, pg_core_1.text)("assigned_to"),
421
+ department: (0, pg_core_1.varchar)("department", { length: 100 }),
422
+ // Configuration and Settings
423
+ configuration: (0, pg_core_1.jsonb)("configuration").$type(),
424
+ // Purpose and Business Context
425
+ purpose: (0, pg_core_1.varchar)("purpose", { length: 200 }),
426
+ businessJustification: (0, pg_core_1.text)("business_justification"),
427
+ expectedOutcome: (0, pg_core_1.text)("expected_outcome"),
428
+ actualOutcome: (0, pg_core_1.text)("actual_outcome"),
429
+ // Compliance and Governance
430
+ complianceRequirements: (0, pg_core_1.jsonb)("compliance_requirements")
431
+ .$type()
432
+ .default([]),
433
+ approvalRequired: (0, pg_core_1.boolean)("approval_required").default(false),
434
+ approvedBy: (0, pg_core_1.text)("approved_by"),
435
+ approvedAt: (0, pg_core_1.timestamp)("approved_at", { withTimezone: true }),
436
+ // Risk Assessment
437
+ riskLevel: (0, pg_core_1.varchar)("risk_level", { length: 20 })
438
+ .$type()
439
+ .default("LOW"),
440
+ riskFactors: (0, pg_core_1.jsonb)("risk_factors")
441
+ .$type()
442
+ .default([]),
443
+ // Metrics and KPIs
444
+ kpis: (0, pg_core_1.jsonb)("kpis")
445
+ .$type()
446
+ .default({}),
447
+ // Progress Tracking
448
+ progress: (0, pg_core_1.integer)("progress").default(0), // 0-100 percentage
449
+ milestones: (0, pg_core_1.jsonb)("milestones")
450
+ .$type()
451
+ .default([]),
452
+ // Event Statistics
453
+ totalEvents: (0, pg_core_1.integer)("total_events").notNull().default(0),
454
+ successfulEvents: (0, pg_core_1.integer)("successful_events").notNull().default(0),
455
+ failedEvents: (0, pg_core_1.integer)("failed_events").notNull().default(0),
456
+ // Activity Tracking
457
+ lastActivityAt: (0, pg_core_1.timestamp)("last_activity_at", { withTimezone: true }),
458
+ lastEventId: (0, pg_core_1.text)("last_event_id"),
459
+ // Alerting and Monitoring
460
+ alertingEnabled: (0, pg_core_1.boolean)("alerting_enabled").notNull().default(true),
461
+ alertThresholds: (0, pg_core_1.jsonb)("alert_thresholds")
462
+ .$type()
463
+ .default({}),
464
+ // Data Retention
465
+ retentionPeriod: (0, pg_core_1.integer)("retention_period").default(2555), // days
466
+ // Integration and External Systems
467
+ externalTrailId: (0, pg_core_1.text)("external_trail_id"),
468
+ externalSystemName: (0, pg_core_1.varchar)("external_system_name", { length: 100 }),
469
+ // Audit Information
470
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
471
+ .defaultNow()
472
+ .notNull(),
473
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
474
+ .defaultNow()
475
+ .notNull(),
476
+ createdBy: (0, pg_core_1.text)("created_by"),
477
+ lastModifiedBy: (0, pg_core_1.text)("last_modified_by"),
478
+ }, (table) => ({
479
+ // Primary business indexes
480
+ storeTrailsIndex: (0, pg_core_1.index)("idx_store_audit_trails_store").on(table.storeId, table.status),
481
+ trailTypeIndex: (0, pg_core_1.index)("idx_store_audit_trails_type").on(table.trailType, table.status),
482
+ subjectIndex: (0, pg_core_1.index)("idx_store_audit_trails_subject").on(table.subjectType, table.subjectId),
483
+ // Status and timeline tracking
484
+ statusIndex: (0, pg_core_1.index)("idx_store_audit_trails_status").on(table.status, table.startedAt),
485
+ timelineIndex: (0, pg_core_1.index)("idx_store_audit_trails_timeline").on(table.startedAt, table.completedAt),
486
+ // Ownership and responsibility
487
+ ownerIndex: (0, pg_core_1.index)("idx_store_audit_trails_owner").on(table.ownerId, table.status),
488
+ // Activity monitoring
489
+ activityIndex: (0, pg_core_1.index)("idx_store_audit_trails_activity").on(table.lastActivityAt, table.status),
490
+ // Risk and compliance
491
+ riskIndex: (0, pg_core_1.index)("idx_store_audit_trails_risk").on(table.riskLevel, table.storeId),
492
+ }));
493
+ // =====================================================
494
+ // STORE AUDIT RELATIONSHIPS
495
+ // =====================================================
496
+ /**
497
+ * Define relationships between audit tables and core store entities
498
+ */
499
+ exports.storeAuditRelations = (0, drizzle_orm_1.relations)(exports.storeAuditLogs, ({ one, many }) => ({
500
+ // Link to trails (when workflowId is present)
501
+ trail: one(exports.storeAuditTrails, {
502
+ fields: [exports.storeAuditLogs.workflowId],
503
+ references: [exports.storeAuditTrails.id],
504
+ }),
505
+ // Parent-child event relationships
506
+ parentEvent: one(exports.storeAuditLogs, {
507
+ fields: [exports.storeAuditLogs.parentEventId],
508
+ references: [exports.storeAuditLogs.id],
509
+ relationName: "childEvents",
510
+ }),
511
+ childEvents: many(exports.storeAuditLogs, {
512
+ relationName: "childEvents",
513
+ }),
514
+ }));
515
+ // =====================================================
516
+ // SCHEMA VALIDATION AND BUSINESS RULES
517
+ // =====================================================
518
+ /**
519
+ * Business rules and constraints for store audit logging
520
+ */
521
+ exports.STORE_AUDIT_BUSINESS_RULES = {
522
+ // Retention periods by event type (in days)
523
+ RETENTION_PERIODS: {
524
+ SECURITY_EVENT: 2555, // 7 years
525
+ COMPLIANCE_ACTION: 2555,
526
+ DELETE: 2555,
527
+ FINANCIAL: 2555,
528
+ STANDARD: 1095, // 3 years
529
+ SYSTEM_ACTION: 365, // 1 year
530
+ },
531
+ // Risk level escalation rules
532
+ RISK_ESCALATION: {
533
+ CRITICAL: {
534
+ immediateFlush: true,
535
+ alertRequired: true,
536
+ approvalRequired: true,
537
+ },
538
+ HIGH: {
539
+ immediateFlush: true,
540
+ alertRequired: true,
541
+ },
542
+ MEDIUM: {
543
+ batchFlush: true,
544
+ },
545
+ LOW: {
546
+ batchFlush: true,
547
+ },
548
+ },
549
+ // Compliance framework mappings
550
+ COMPLIANCE_MAPPINGS: {
551
+ PII_ACCESS: ["GDPR", "CCPA"],
552
+ FINANCIAL_DATA: ["PCI_DSS", "SOX"],
553
+ HEALTH_DATA: ["HIPAA"],
554
+ ALL_DATA: ["ISO27001"],
555
+ },
556
+ };