ts-prorm-orm 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.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- package/package.json +190 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Audit History Query methods
|
|
4
|
+
* Provides model-level and instance-level methods for querying audit history
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.setAuditLogger = setAuditLogger;
|
|
8
|
+
exports.getAuditLogger = getAuditLogger;
|
|
9
|
+
exports.addAuditHistoryToModel = addAuditHistoryToModel;
|
|
10
|
+
exports.addAuditHistoryToInstance = addAuditHistoryToInstance;
|
|
11
|
+
// Store reference to the AuditLogger instance
|
|
12
|
+
let auditLoggerInstance = null;
|
|
13
|
+
/**
|
|
14
|
+
* Set the global AuditLogger instance
|
|
15
|
+
* This should be called once when setting up audit logging
|
|
16
|
+
*
|
|
17
|
+
* @param logger - The AuditLogger instance
|
|
18
|
+
*/
|
|
19
|
+
function setAuditLogger(logger) {
|
|
20
|
+
auditLoggerInstance = logger;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the current AuditLogger instance
|
|
24
|
+
*/
|
|
25
|
+
function getAuditLogger() {
|
|
26
|
+
return auditLoggerInstance;
|
|
27
|
+
}
|
|
28
|
+
// ==================== Model-Level Methods ====================
|
|
29
|
+
/**
|
|
30
|
+
* Add model-level audit history methods to a Model class
|
|
31
|
+
*
|
|
32
|
+
* @param model - The Model static (class) to add methods to
|
|
33
|
+
*/
|
|
34
|
+
function addAuditHistoryToModel(model) {
|
|
35
|
+
const tableName = model.tableName || model.name;
|
|
36
|
+
/**
|
|
37
|
+
* Get audit history for this model
|
|
38
|
+
*
|
|
39
|
+
* @param options - Query options
|
|
40
|
+
* @returns Promise resolving to array of AuditLog entries
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* const history = await User.getAuditHistory({ limit: 10 });
|
|
44
|
+
*/
|
|
45
|
+
model.getAuditHistory = async function (options) {
|
|
46
|
+
const logger = getAuditLogger();
|
|
47
|
+
if (!logger) {
|
|
48
|
+
throw new Error('AuditLogger not initialized. Call setAuditLogger() first.');
|
|
49
|
+
}
|
|
50
|
+
return logger.getHistory(tableName, undefined, options);
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Get audit history for a specific record
|
|
54
|
+
*
|
|
55
|
+
* @param recordId - The record ID
|
|
56
|
+
* @param options - Query options
|
|
57
|
+
* @returns Promise resolving to array of AuditLog entries
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* const history = await User.getAuditHistoryForRecord(123);
|
|
61
|
+
*/
|
|
62
|
+
model.getAuditHistoryForRecord = async function (recordId, options) {
|
|
63
|
+
const logger = getAuditLogger();
|
|
64
|
+
if (!logger) {
|
|
65
|
+
throw new Error('AuditLogger not initialized. Call setAuditLogger() first.');
|
|
66
|
+
}
|
|
67
|
+
return logger.getHistory(tableName, recordId, options);
|
|
68
|
+
};
|
|
69
|
+
// Store table name for instance methods
|
|
70
|
+
model.__auditTableName__ = tableName;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Add instance-level audit history methods to a ModelInstance
|
|
74
|
+
*
|
|
75
|
+
* @param instance - The Model instance prototype
|
|
76
|
+
*/
|
|
77
|
+
function addAuditHistoryToInstance(instance) {
|
|
78
|
+
/**
|
|
79
|
+
* Get audit history for this specific record
|
|
80
|
+
*
|
|
81
|
+
* @param options - Query options
|
|
82
|
+
* @returns Promise resolving to array of AuditLog entries
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* const user = await User.findById(123);
|
|
86
|
+
* const history = await user.getAuditHistory();
|
|
87
|
+
*/
|
|
88
|
+
instance.getAuditHistory = async function (options) {
|
|
89
|
+
const logger = getAuditLogger();
|
|
90
|
+
if (!logger) {
|
|
91
|
+
throw new Error('AuditLogger not initialized. Call setAuditLogger() first.');
|
|
92
|
+
}
|
|
93
|
+
const model = this.constructor;
|
|
94
|
+
const tableName = model.tableName || model.name;
|
|
95
|
+
const recordId = this.id;
|
|
96
|
+
return logger.getHistory(tableName, recordId, options);
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Get the previous value of a specific field
|
|
100
|
+
*
|
|
101
|
+
* @param fieldName - The name of the field
|
|
102
|
+
* @returns The previous value of the field, or undefined
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* const user = await User.findById(123);
|
|
106
|
+
* await user.update({ name: 'John' });
|
|
107
|
+
* const previousName = user.getPreviousValue('name');
|
|
108
|
+
* console.log(previousName); // 'Jane'
|
|
109
|
+
*/
|
|
110
|
+
instance.getPreviousValue = function (fieldName) {
|
|
111
|
+
const previousDataValues = this._previousDataValues;
|
|
112
|
+
if (!previousDataValues) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
return previousDataValues[fieldName];
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Get all previous values
|
|
119
|
+
*
|
|
120
|
+
* @returns Object containing previous field values
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* const user = await User.findById(123);
|
|
124
|
+
* await user.update({ name: 'John', email: 'john@example.com' });
|
|
125
|
+
* const previousValues = user.getPreviousValues();
|
|
126
|
+
*/
|
|
127
|
+
instance.getPreviousValues = function () {
|
|
128
|
+
return this._previousDataValues ? { ...this._previousDataValues } : {};
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Check if a field was changed
|
|
132
|
+
*
|
|
133
|
+
* @param fieldName - The name of the field
|
|
134
|
+
* @returns True if the field was changed
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* const user = await User.findById(123);
|
|
138
|
+
* await user.update({ name: 'John' });
|
|
139
|
+
* console.log(user.wasChanged('name')); // true
|
|
140
|
+
*/
|
|
141
|
+
instance.wasChanged = function (fieldName) {
|
|
142
|
+
const previousDataValues = this._previousDataValues;
|
|
143
|
+
if (!previousDataValues) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return previousDataValues[fieldName] !== undefined;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Get changes between previous and current values
|
|
150
|
+
*
|
|
151
|
+
* @returns Object with changed fields and their old/new values
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* const user = await User.findById(123);
|
|
155
|
+
* await user.update({ name: 'John', email: 'john@example.com' });
|
|
156
|
+
* const changes = user.getChanges();
|
|
157
|
+
* // { name: { old: 'Jane', new: 'John' }, ... }
|
|
158
|
+
*/
|
|
159
|
+
instance.getChanges = function () {
|
|
160
|
+
const changes = {};
|
|
161
|
+
const previousDataValues = this._previousDataValues || {};
|
|
162
|
+
const currentValues = this.dataValues || {};
|
|
163
|
+
const allKeys = new Set([...Object.keys(previousDataValues), ...Object.keys(currentValues)]);
|
|
164
|
+
for (const key of allKeys) {
|
|
165
|
+
const oldVal = previousDataValues[key];
|
|
166
|
+
const newVal = currentValues[key];
|
|
167
|
+
if (oldVal !== newVal) {
|
|
168
|
+
changes[key] = { old: oldVal, new: newVal };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return changes;
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ==================== Default Export ====================
|
|
175
|
+
exports.default = {
|
|
176
|
+
setAuditLogger,
|
|
177
|
+
getAuditLogger,
|
|
178
|
+
addAuditHistoryToModel,
|
|
179
|
+
addAuditHistoryToInstance,
|
|
180
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Audit Module
|
|
4
|
+
* Provides audit logging capabilities for tracking model changes
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.addAuditHistoryToInstance = exports.addAuditHistoryToModel = exports.getAuditLogger = exports.setAuditLogger = exports.AuditLogger = void 0;
|
|
8
|
+
var logger_1 = require("./logger");
|
|
9
|
+
Object.defineProperty(exports, "AuditLogger", { enumerable: true, get: function () { return logger_1.AuditLogger; } });
|
|
10
|
+
var history_query_1 = require("./history-query");
|
|
11
|
+
Object.defineProperty(exports, "setAuditLogger", { enumerable: true, get: function () { return history_query_1.setAuditLogger; } });
|
|
12
|
+
Object.defineProperty(exports, "getAuditLogger", { enumerable: true, get: function () { return history_query_1.getAuditLogger; } });
|
|
13
|
+
Object.defineProperty(exports, "addAuditHistoryToModel", { enumerable: true, get: function () { return history_query_1.addAuditHistoryToModel; } });
|
|
14
|
+
Object.defineProperty(exports, "addAuditHistoryToInstance", { enumerable: true, get: function () { return history_query_1.addAuditHistoryToInstance; } });
|
|
15
|
+
const logger_2 = require("./logger");
|
|
16
|
+
const history_query_2 = require("./history-query");
|
|
17
|
+
exports.default = {
|
|
18
|
+
AuditLogger: logger_2.AuditLogger,
|
|
19
|
+
setAuditLogger: history_query_2.setAuditLogger,
|
|
20
|
+
getAuditLogger: history_query_2.getAuditLogger,
|
|
21
|
+
addAuditHistoryToModel: history_query_2.addAuditHistoryToModel,
|
|
22
|
+
addAuditHistoryToInstance: history_query_2.addAuditHistoryToInstance,
|
|
23
|
+
};
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Audit Logger for the TypeScript ORM
|
|
4
|
+
* Provides persistent audit logging for model changes with database storage
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AuditLogger = void 0;
|
|
8
|
+
const data_types_1 = require("../models/data-types");
|
|
9
|
+
// ==================== AuditLogger Class ====================
|
|
10
|
+
/**
|
|
11
|
+
* AuditLogger - Provides persistent audit logging for model changes
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const auditLogger = new AuditLogger(prorm);
|
|
15
|
+
* await auditLogger.setupHooks();
|
|
16
|
+
*
|
|
17
|
+
* // Manually log an action
|
|
18
|
+
* await auditLogger.logAction('CREATE', 'User', 1, {}, { name: 'John' });
|
|
19
|
+
*
|
|
20
|
+
* // Get audit history
|
|
21
|
+
* const history = await auditLogger.getHistory('User', 1);
|
|
22
|
+
*/
|
|
23
|
+
class AuditLogger {
|
|
24
|
+
/**
|
|
25
|
+
* Create a new AuditLogger instance
|
|
26
|
+
*
|
|
27
|
+
* @param prorm - The Prorm instance
|
|
28
|
+
* @param options - Optional configuration options
|
|
29
|
+
*/
|
|
30
|
+
constructor(prorm, options) {
|
|
31
|
+
this.auditModel = null;
|
|
32
|
+
this.hookedModels = new Set();
|
|
33
|
+
this.prorm = prorm;
|
|
34
|
+
this.options = {
|
|
35
|
+
tableName: options?.tableName ?? 'AuditLogs',
|
|
36
|
+
userIdGetter: options?.userIdGetter ?? (() => undefined),
|
|
37
|
+
ipAddressGetter: options?.ipAddressGetter ?? (() => undefined),
|
|
38
|
+
modelName: options?.modelName ?? 'AuditLog',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the audit model
|
|
43
|
+
*/
|
|
44
|
+
getModel() {
|
|
45
|
+
return this.auditModel;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the current user ID
|
|
49
|
+
*/
|
|
50
|
+
getUserId() {
|
|
51
|
+
return this.options.userIdGetter();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the current IP address
|
|
55
|
+
*/
|
|
56
|
+
getIpAddress() {
|
|
57
|
+
return this.options.ipAddressGetter();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Define and create the audit log model
|
|
61
|
+
*/
|
|
62
|
+
async ensureAuditModel() {
|
|
63
|
+
if (this.auditModel) {
|
|
64
|
+
return this.auditModel;
|
|
65
|
+
}
|
|
66
|
+
const { tableName, modelName } = this.options;
|
|
67
|
+
// Check if model already exists using prorm.model()
|
|
68
|
+
const existingModel = this.prorm.model(modelName);
|
|
69
|
+
if (existingModel) {
|
|
70
|
+
this.auditModel = existingModel;
|
|
71
|
+
return existingModel;
|
|
72
|
+
}
|
|
73
|
+
// Define the audit log model
|
|
74
|
+
const AuditLogModel = this.prorm.define(modelName, {
|
|
75
|
+
id: {
|
|
76
|
+
type: data_types_1.DataTypes.INTEGER(),
|
|
77
|
+
primaryKey: true,
|
|
78
|
+
autoIncrement: true,
|
|
79
|
+
},
|
|
80
|
+
tableName: {
|
|
81
|
+
type: data_types_1.DataTypes.STRING(255),
|
|
82
|
+
allowNull: false,
|
|
83
|
+
},
|
|
84
|
+
action: {
|
|
85
|
+
type: data_types_1.DataTypes.ENUM('CREATE', 'UPDATE', 'DELETE'),
|
|
86
|
+
allowNull: false,
|
|
87
|
+
},
|
|
88
|
+
recordId: {
|
|
89
|
+
type: data_types_1.DataTypes.STRING(255),
|
|
90
|
+
allowNull: false,
|
|
91
|
+
},
|
|
92
|
+
oldValues: {
|
|
93
|
+
type: data_types_1.DataTypes.JSON(),
|
|
94
|
+
allowNull: true,
|
|
95
|
+
},
|
|
96
|
+
newValues: {
|
|
97
|
+
type: data_types_1.DataTypes.JSON(),
|
|
98
|
+
allowNull: true,
|
|
99
|
+
},
|
|
100
|
+
userId: {
|
|
101
|
+
type: data_types_1.DataTypes.STRING(255),
|
|
102
|
+
allowNull: true,
|
|
103
|
+
},
|
|
104
|
+
timestamp: {
|
|
105
|
+
type: data_types_1.DataTypes.DATE(),
|
|
106
|
+
allowNull: false,
|
|
107
|
+
defaultValue: data_types_1.DataTypes.NOW(),
|
|
108
|
+
},
|
|
109
|
+
ipAddress: {
|
|
110
|
+
type: data_types_1.DataTypes.STRING(45),
|
|
111
|
+
allowNull: true,
|
|
112
|
+
},
|
|
113
|
+
}, {
|
|
114
|
+
tableName,
|
|
115
|
+
timestamps: false,
|
|
116
|
+
underscored: true,
|
|
117
|
+
});
|
|
118
|
+
this.auditModel = AuditLogModel;
|
|
119
|
+
return AuditLogModel;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Log an audit action
|
|
123
|
+
*
|
|
124
|
+
* @param action - The type of action (CREATE, UPDATE, DELETE)
|
|
125
|
+
* @param tableName - The name of the table
|
|
126
|
+
* @param recordId - The primary key of the record
|
|
127
|
+
* @param oldValues - The previous values (for UPDATE/DELETE)
|
|
128
|
+
* @param newValues - The new values (for CREATE/UPDATE)
|
|
129
|
+
*/
|
|
130
|
+
async logAction(action, tableName, recordId, oldValues, newValues) {
|
|
131
|
+
const auditModel = await this.ensureAuditModel();
|
|
132
|
+
await auditModel.create({
|
|
133
|
+
tableName,
|
|
134
|
+
action,
|
|
135
|
+
recordId: String(recordId),
|
|
136
|
+
oldValues: oldValues ?? null,
|
|
137
|
+
newValues: newValues ?? null,
|
|
138
|
+
userId: this.getUserId() ?? null,
|
|
139
|
+
timestamp: new Date(),
|
|
140
|
+
ipAddress: this.getIpAddress() ?? null,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get audit history for a table and optional record
|
|
145
|
+
*
|
|
146
|
+
* @param tableName - The name of the table
|
|
147
|
+
* @param recordId - Optional record ID to filter by
|
|
148
|
+
* @param options - Query options
|
|
149
|
+
*/
|
|
150
|
+
async getHistory(tableName, recordId, options) {
|
|
151
|
+
const auditModel = await this.ensureAuditModel();
|
|
152
|
+
const where = {
|
|
153
|
+
tableName,
|
|
154
|
+
};
|
|
155
|
+
if (recordId !== undefined) {
|
|
156
|
+
where.recordId = String(recordId);
|
|
157
|
+
}
|
|
158
|
+
if (options?.startDate || options?.endDate) {
|
|
159
|
+
where.timestamp = {};
|
|
160
|
+
if (options.startDate) {
|
|
161
|
+
where.timestamp[Symbol.for('gte')] = options.startDate;
|
|
162
|
+
}
|
|
163
|
+
if (options.endDate) {
|
|
164
|
+
where.timestamp[Symbol.for('lte')] = options.endDate;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const results = await auditModel.findAll({
|
|
168
|
+
where,
|
|
169
|
+
order: [['timestamp', 'DESC']],
|
|
170
|
+
limit: options?.limit ?? 100,
|
|
171
|
+
offset: options?.offset ?? 0,
|
|
172
|
+
});
|
|
173
|
+
return results.map((r) => ({
|
|
174
|
+
id: r.id,
|
|
175
|
+
tableName: r.tableName,
|
|
176
|
+
action: r.action,
|
|
177
|
+
recordId: r.recordId,
|
|
178
|
+
oldValues: r.oldValues,
|
|
179
|
+
newValues: r.newValues,
|
|
180
|
+
userId: r.userId,
|
|
181
|
+
timestamp: r.timestamp,
|
|
182
|
+
ipAddress: r.ipAddress,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Setup hooks for all models to automatically log changes
|
|
187
|
+
*
|
|
188
|
+
* This method iterates through all registered models and adds
|
|
189
|
+
* beforeCreate, beforeUpdate, and beforeDestroy hooks
|
|
190
|
+
*/
|
|
191
|
+
setupHooks() {
|
|
192
|
+
const models = this.prorm.getModels();
|
|
193
|
+
for (const [, model] of models) {
|
|
194
|
+
this.addHooksToModel(model);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Add audit hooks to a specific model
|
|
199
|
+
*
|
|
200
|
+
* @param model - The model to add hooks to
|
|
201
|
+
*/
|
|
202
|
+
addHooksToModel(model) {
|
|
203
|
+
if (this.hookedModels.has(model)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const tableName = model.tableName || model.name;
|
|
207
|
+
// beforeCreate hook
|
|
208
|
+
model.hook('beforeCreate', async (instance) => {
|
|
209
|
+
const newValues = instance.toJSON ? instance.toJSON() : { ...instance.dataValues };
|
|
210
|
+
await this.logAction('CREATE', tableName, instance.id, undefined, newValues);
|
|
211
|
+
});
|
|
212
|
+
// beforeUpdate hook
|
|
213
|
+
model.hook('beforeUpdate', async (instance) => {
|
|
214
|
+
const oldValues = instance._previousDataValues ? { ...instance._previousDataValues } : {};
|
|
215
|
+
const newValues = instance.toJSON ? instance.toJSON() : { ...instance.dataValues };
|
|
216
|
+
await this.logAction('UPDATE', tableName, instance.id, oldValues, newValues);
|
|
217
|
+
});
|
|
218
|
+
// beforeDestroy hook
|
|
219
|
+
model.hook('beforeDestroy', async (instance) => {
|
|
220
|
+
const oldValues = instance.toJSON ? instance.toJSON() : { ...instance.dataValues };
|
|
221
|
+
await this.logAction('DELETE', tableName, instance.id, oldValues, undefined);
|
|
222
|
+
});
|
|
223
|
+
this.hookedModels.add(model);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if a model has audit hooks
|
|
227
|
+
*
|
|
228
|
+
* @param model - The model to check
|
|
229
|
+
*/
|
|
230
|
+
hasHooks(model) {
|
|
231
|
+
return this.hookedModels.has(model);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.AuditLogger = AuditLogger;
|
|
235
|
+
// ==================== Default Export ====================
|
|
236
|
+
exports.default = AuditLogger;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cache Manager - Abstract CacheBackend interface
|
|
4
|
+
*
|
|
5
|
+
* Defines the contract for cache backends used in query result caching.
|
|
6
|
+
* Supports L1 (in-memory) and L2 (distributed) caching layers.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AbstractCacheManager = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Abstract cache manager with L1/L2 support
|
|
12
|
+
*/
|
|
13
|
+
class AbstractCacheManager {
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.stats = {
|
|
16
|
+
hits: 0,
|
|
17
|
+
misses: 0,
|
|
18
|
+
l1Hits: 0,
|
|
19
|
+
l2Hits: 0,
|
|
20
|
+
keys: 0,
|
|
21
|
+
hitRate: 0,
|
|
22
|
+
};
|
|
23
|
+
this.options = this.normalizeOptions(options);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Normalize and set default options
|
|
27
|
+
*/
|
|
28
|
+
normalizeOptions(options) {
|
|
29
|
+
return {
|
|
30
|
+
l1: {
|
|
31
|
+
enabled: options.l1?.enabled ?? true,
|
|
32
|
+
maxEntries: options.l1?.maxEntries ?? 1000,
|
|
33
|
+
ttl: options.l1?.ttl ?? 60,
|
|
34
|
+
},
|
|
35
|
+
l2: {
|
|
36
|
+
enabled: options.l2?.enabled ?? true,
|
|
37
|
+
defaultTtl: options.l2?.defaultTtl ?? 3600,
|
|
38
|
+
},
|
|
39
|
+
key: {
|
|
40
|
+
prefix: options.key?.prefix ?? 'orm:cache:',
|
|
41
|
+
separator: options.key?.separator ?? ':',
|
|
42
|
+
},
|
|
43
|
+
readFromReplicas: options.readFromReplicas ?? false,
|
|
44
|
+
clusterNodes: options.clusterNodes ?? [],
|
|
45
|
+
clusterOptions: options.clusterOptions ?? {},
|
|
46
|
+
maxConnections: options.maxConnections ?? 10,
|
|
47
|
+
connectTimeout: options.connectTimeout ?? 10000,
|
|
48
|
+
commandTimeout: options.commandTimeout ?? 5000,
|
|
49
|
+
retryStrategy: options.retryStrategy ?? null,
|
|
50
|
+
db: options.db ?? 0,
|
|
51
|
+
enableKeyspaceNotifications: options.enableKeyspaceNotifications ?? false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build a full cache key with prefix
|
|
56
|
+
*/
|
|
57
|
+
buildKey(key) {
|
|
58
|
+
return `${this.options.key.prefix}${key}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get cache statistics
|
|
62
|
+
*/
|
|
63
|
+
getStats() {
|
|
64
|
+
const total = this.stats.hits + this.stats.misses;
|
|
65
|
+
return {
|
|
66
|
+
...this.stats,
|
|
67
|
+
hitRate: total > 0 ? this.stats.hits / total : 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reset cache statistics
|
|
72
|
+
*/
|
|
73
|
+
resetStats() {
|
|
74
|
+
this.stats = {
|
|
75
|
+
hits: 0,
|
|
76
|
+
misses: 0,
|
|
77
|
+
l1Hits: 0,
|
|
78
|
+
l2Hits: 0,
|
|
79
|
+
keys: 0,
|
|
80
|
+
hitRate: 0,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.AbstractCacheManager = AbstractCacheManager;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cache Module
|
|
4
|
+
*
|
|
5
|
+
* Provides caching functionality for query results using Redis Cluster
|
|
6
|
+
* with L1 (in-memory) and L2 (distributed Redis) cache layers.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createRedisClusterCache = exports.RedisClusterCache = exports.AbstractCacheManager = void 0;
|
|
10
|
+
// Re-export cache manager types
|
|
11
|
+
var cache_manager_1 = require("./cache-manager");
|
|
12
|
+
Object.defineProperty(exports, "AbstractCacheManager", { enumerable: true, get: function () { return cache_manager_1.AbstractCacheManager; } });
|
|
13
|
+
// Re-export Redis cluster cache
|
|
14
|
+
var redis_cluster_cache_1 = require("./redis-cluster-cache");
|
|
15
|
+
Object.defineProperty(exports, "RedisClusterCache", { enumerable: true, get: function () { return redis_cluster_cache_1.RedisClusterCache; } });
|
|
16
|
+
Object.defineProperty(exports, "createRedisClusterCache", { enumerable: true, get: function () { return redis_cluster_cache_1.createRedisClusterCache; } });
|