@plyaz/db 0.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.
- package/README.md +169 -0
- package/dist/adapters/drizzle/DrizzleAdapter.d.ts +269 -0
- package/dist/adapters/drizzle/DrizzleAdapter.d.ts.map +1 -0
- package/dist/adapters/index.d.ts +20 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/sql/SQLAdapter.d.ts +282 -0
- package/dist/adapters/sql/SQLAdapter.d.ts.map +1 -0
- package/dist/adapters/supabase/SupabaseAdapter.d.ts +305 -0
- package/dist/adapters/supabase/SupabaseAdapter.d.ts.map +1 -0
- package/dist/advanced/backup/BackupService.d.ts +159 -0
- package/dist/advanced/backup/BackupService.d.ts.map +1 -0
- package/dist/advanced/backup/index.d.ts +2 -0
- package/dist/advanced/backup/index.d.ts.map +1 -0
- package/dist/advanced/caching/CacheEvict.decorator.d.ts +3 -0
- package/dist/advanced/caching/CacheEvict.decorator.d.ts.map +1 -0
- package/dist/advanced/caching/Cacheable.decorator.d.ts +99 -0
- package/dist/advanced/caching/Cacheable.decorator.d.ts.map +1 -0
- package/dist/advanced/caching/RedisCache.d.ts +417 -0
- package/dist/advanced/caching/RedisCache.d.ts.map +1 -0
- package/dist/advanced/caching/index.d.ts +4 -0
- package/dist/advanced/caching/index.d.ts.map +1 -0
- package/dist/advanced/connection-pool/DynamicPool.d.ts +234 -0
- package/dist/advanced/connection-pool/DynamicPool.d.ts.map +1 -0
- package/dist/advanced/connection-pool/index.d.ts +2 -0
- package/dist/advanced/connection-pool/index.d.ts.map +1 -0
- package/dist/advanced/index.d.ts +8 -0
- package/dist/advanced/index.d.ts.map +1 -0
- package/dist/advanced/monitoring/AlertManager.d.ts +72 -0
- package/dist/advanced/monitoring/AlertManager.d.ts.map +1 -0
- package/dist/advanced/monitoring/MetricsCollector.d.ts +81 -0
- package/dist/advanced/monitoring/MetricsCollector.d.ts.map +1 -0
- package/dist/advanced/monitoring/index.d.ts +3 -0
- package/dist/advanced/monitoring/index.d.ts.map +1 -0
- package/dist/advanced/multi-tenancy/TenantContext.d.ts +52 -0
- package/dist/advanced/multi-tenancy/TenantContext.d.ts.map +1 -0
- package/dist/advanced/multi-tenancy/TenantRepository.d.ts +292 -0
- package/dist/advanced/multi-tenancy/TenantRepository.d.ts.map +1 -0
- package/dist/advanced/multi-tenancy/index.d.ts +3 -0
- package/dist/advanced/multi-tenancy/index.d.ts.map +1 -0
- package/dist/advanced/read-replica/ReadReplicaAdapter.d.ts +516 -0
- package/dist/advanced/read-replica/ReadReplicaAdapter.d.ts.map +1 -0
- package/dist/advanced/read-replica/ReadReplicaManager.d.ts +68 -0
- package/dist/advanced/read-replica/ReadReplicaManager.d.ts.map +1 -0
- package/dist/advanced/read-replica/UseReplica.decorator.d.ts +24 -0
- package/dist/advanced/read-replica/UseReplica.decorator.d.ts.map +1 -0
- package/dist/advanced/read-replica/index.d.ts +3 -0
- package/dist/advanced/read-replica/index.d.ts.map +1 -0
- package/dist/advanced/sharding/ShardKey.d.ts +80 -0
- package/dist/advanced/sharding/ShardKey.d.ts.map +1 -0
- package/dist/advanced/sharding/ShardRouter.d.ts +66 -0
- package/dist/advanced/sharding/ShardRouter.d.ts.map +1 -0
- package/dist/advanced/sharding/index.d.ts +3 -0
- package/dist/advanced/sharding/index.d.ts.map +1 -0
- package/dist/builder/query/index.d.ts +7 -0
- package/dist/builder/query/index.d.ts.map +1 -0
- package/dist/builder/query/orm.d.ts +22 -0
- package/dist/builder/query/orm.d.ts.map +1 -0
- package/dist/builder/query/sql.d.ts +29 -0
- package/dist/builder/query/sql.d.ts.map +1 -0
- package/dist/extensions/AuditExtension.d.ts +468 -0
- package/dist/extensions/AuditExtension.d.ts.map +1 -0
- package/dist/extensions/CachingAdapter.d.ts +451 -0
- package/dist/extensions/CachingAdapter.d.ts.map +1 -0
- package/dist/extensions/EncryptionExtension.d.ts +95 -0
- package/dist/extensions/EncryptionExtension.d.ts.map +1 -0
- package/dist/extensions/ReadReplicaAdapter.d.ts +32 -0
- package/dist/extensions/ReadReplicaAdapter.d.ts.map +1 -0
- package/dist/extensions/SoftDeleteExtension.d.ts +430 -0
- package/dist/extensions/SoftDeleteExtension.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +79 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/factory/AdapterFactory.d.ts +111 -0
- package/dist/factory/AdapterFactory.d.ts.map +1 -0
- package/dist/factory/createDatabaseService.d.ts +121 -0
- package/dist/factory/createDatabaseService.d.ts.map +1 -0
- package/dist/index.cjs +8518 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +8480 -0
- package/dist/index.mjs.map +1 -0
- package/dist/repository/BaseRepository.d.ts +209 -0
- package/dist/repository/BaseRepository.d.ts.map +1 -0
- package/dist/repository/index.d.ts +80 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/security/index.cjs +118 -0
- package/dist/security/index.cjs.map +1 -0
- package/dist/security/index.d.ts +3 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.mjs +114 -0
- package/dist/security/index.mjs.map +1 -0
- package/dist/security/sanitizers/html.sanitizer.d.ts +31 -0
- package/dist/security/sanitizers/html.sanitizer.d.ts.map +1 -0
- package/dist/security/serializers/DataValidation.d.ts +34 -0
- package/dist/security/serializers/DataValidation.d.ts.map +1 -0
- package/dist/service/DatabaseService.d.ts +136 -0
- package/dist/service/DatabaseService.d.ts.map +1 -0
- package/dist/service/EventEmitter.d.ts +110 -0
- package/dist/service/EventEmitter.d.ts.map +1 -0
- package/dist/service/HealthManager.d.ts +166 -0
- package/dist/service/HealthManager.d.ts.map +1 -0
- package/dist/utils/ConfigMerger.d.ts +227 -0
- package/dist/utils/ConfigMerger.d.ts.map +1 -0
- package/dist/utils/databaseResultHelpers.d.ts +98 -0
- package/dist/utils/databaseResultHelpers.d.ts.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/normalizeDetails.d.ts +111 -0
- package/dist/utils/normalizeDetails.d.ts.map +1 -0
- package/dist/utils/pagination.d.ts +77 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/regex.d.ts +199 -0
- package/dist/utils/regex.d.ts.map +1 -0
- package/dist/utils/typeGuards.d.ts +57 -0
- package/dist/utils/typeGuards.d.ts.map +1 -0
- package/dist/utils/validation.d.ts +146 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/package.json +156 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Internal Database Service Implementation for @plyaz/db package
|
|
3
|
+
*
|
|
4
|
+
* This module provides the internal DatabaseService class that orchestrates all database
|
|
5
|
+
* operations. It is NOT exported and is created internally by the createDatabaseService() factory.
|
|
6
|
+
*
|
|
7
|
+
* Part of the @plyaz/db package - a TypeScript database abstraction layer with
|
|
8
|
+
* support for multiple adapters (Drizzle, Supabase, SQL), extensions (audit, encryption,
|
|
9
|
+
* soft delete), and advanced features (caching, read replicas, multi-tenancy).
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
import { DatabaseEventEmitter } from "./EventEmitter";
|
|
13
|
+
import type { AuditContext, BatchUpdate, CreateInput, DatabaseAdapterType, DatabaseEvent, DatabaseEvents, DatabaseHealthStatus, DatabaseResult, DatabaseServiceConfig, DatabaseServiceInterface, Filter, OperationConfig, PaginatedResult, QueryOptions, ServiceStatus, TableName, TransactionFn, UpdateInput } from "@plyaz/types/db";
|
|
14
|
+
/**
|
|
15
|
+
* 🛠️ DATABASE SERVICE - Internal Service Layer
|
|
16
|
+
*
|
|
17
|
+
* Core service implementation that orchestrates all database operations.
|
|
18
|
+
* NOT EXPORTED - created internally by createDatabaseService() factory.
|
|
19
|
+
*
|
|
20
|
+
* **Application Flow Position:**
|
|
21
|
+
* createDatabaseService() → **DatabaseService** → Adapter Chain → Database
|
|
22
|
+
*
|
|
23
|
+
* **What this class does:**
|
|
24
|
+
* 1. Stores global configuration from createDatabaseService()
|
|
25
|
+
* 2. Receives calls from repositories via IDatabaseService interface
|
|
26
|
+
* 3. Merges per-operation config with global config using ConfigMerger
|
|
27
|
+
* 4. Fires before/after events (onBeforeWrite, onAfterWrite, etc.)
|
|
28
|
+
* 5. Delegates to adapter chain with resolved configuration
|
|
29
|
+
* 6. Returns results back to repositories
|
|
30
|
+
*
|
|
31
|
+
* **Called by:** Repository layer (BaseRepository, UserRepository, etc.)
|
|
32
|
+
* **Calls:** ConfigMerger.mergeConfigs(), adapter chain methods, event handlers
|
|
33
|
+
* **Delegates to:** Final wrapped adapter (ReadReplicaAdapter → AuditAdapter → ... → BaseAdapter)
|
|
34
|
+
*
|
|
35
|
+
* **Key Responsibilities:**
|
|
36
|
+
* - Configuration merging and resolution
|
|
37
|
+
* - Event system orchestration
|
|
38
|
+
* - Audit context management
|
|
39
|
+
* - Error handling and propagation
|
|
40
|
+
* - Service status tracking
|
|
41
|
+
*
|
|
42
|
+
* @internal This class is not part of the public API
|
|
43
|
+
*/
|
|
44
|
+
export declare class DatabaseService implements DatabaseServiceInterface {
|
|
45
|
+
private readonly globalConfig;
|
|
46
|
+
private readonly adapter;
|
|
47
|
+
private readonly eventHandlers;
|
|
48
|
+
private readonly eventEmitter;
|
|
49
|
+
private readonly healthManager;
|
|
50
|
+
private readonly startTime;
|
|
51
|
+
private auditContext;
|
|
52
|
+
constructor(config: {
|
|
53
|
+
adapter: DatabaseAdapterType;
|
|
54
|
+
globalConfig: DatabaseServiceConfig;
|
|
55
|
+
eventHandlers?: DatabaseEvents;
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* 🔍 Get a single record by ID
|
|
59
|
+
*
|
|
60
|
+
* **Flow:** Repository.findById() → **DatabaseService.get()** → ConfigMerger → Adapter Chain → Database
|
|
61
|
+
*
|
|
62
|
+
* **What happens:**
|
|
63
|
+
* 1. Merges operation config with global config using ConfigMerger
|
|
64
|
+
* 2. Fires onBeforeRead event (if configured)
|
|
65
|
+
* 3. Delegates to adapter chain: ReadReplica → Audit → Cache → SoftDelete → Encryption → Base
|
|
66
|
+
* 4. Fires onAfterRead event on success
|
|
67
|
+
* 5. Returns result to repository
|
|
68
|
+
*
|
|
69
|
+
* **Called by:** BaseRepository.findById(), custom repository methods
|
|
70
|
+
* **Calls:** ConfigMerger.mergeConfigs(), this.adapter.findById(), event handlers
|
|
71
|
+
*
|
|
72
|
+
* @param table Table name (from Tables enum)
|
|
73
|
+
* @param id Record ID to retrieve
|
|
74
|
+
* @param operationConfig Optional per-operation configuration overrides
|
|
75
|
+
* @returns Promise resolving to the record or null if not found
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* // Called by UserRepository.findById()
|
|
80
|
+
* const user = await this.db.get(Tables.USERS, 'user-123');
|
|
81
|
+
*
|
|
82
|
+
* // With operation config override
|
|
83
|
+
* const user = await this.db.get(Tables.USERS, 'user-123', {
|
|
84
|
+
* forceAdapter: 'primary', // Force primary DB
|
|
85
|
+
* cache: { enabled: false } // Skip cache
|
|
86
|
+
* });
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
get<T>(table: TableName, id: string, operationConfig?: OperationConfig): Promise<DatabaseResult<T | null>>;
|
|
90
|
+
/**
|
|
91
|
+
* List records with optional filtering, sorting, and pagination
|
|
92
|
+
* Merges operation config with global config before delegating
|
|
93
|
+
*/
|
|
94
|
+
list<T>(table: TableName, options?: QueryOptions, operationConfig?: OperationConfig): Promise<DatabaseResult<PaginatedResult<T>>>;
|
|
95
|
+
/**
|
|
96
|
+
* Create a new record
|
|
97
|
+
* Merges operation config with global config before delegating
|
|
98
|
+
*/
|
|
99
|
+
create<T>(table: TableName, input: CreateInput<T>, operationConfig?: OperationConfig): Promise<DatabaseResult<T>>;
|
|
100
|
+
/**
|
|
101
|
+
* Update an existing record
|
|
102
|
+
* Merges operation config with global config before delegating
|
|
103
|
+
*/
|
|
104
|
+
update<T>(table: TableName, id: string, input: UpdateInput<T>, operationConfig?: OperationConfig): Promise<DatabaseResult<T>>;
|
|
105
|
+
/**
|
|
106
|
+
* Delete a record
|
|
107
|
+
* Merges operation config with global config before delegating
|
|
108
|
+
*/
|
|
109
|
+
delete(table: TableName, id: string, operationConfig?: OperationConfig): Promise<DatabaseResult<void>>;
|
|
110
|
+
batchCreate<T>(table: TableName, inputs: CreateInput<T>[], operationConfig?: OperationConfig): Promise<DatabaseResult<T[]>>;
|
|
111
|
+
batchUpdate<T>(table: TableName, updates: BatchUpdate<T>[], operationConfig?: OperationConfig): Promise<DatabaseResult<T[]>>;
|
|
112
|
+
batchDelete(table: TableName, ids: string[], operationConfig?: OperationConfig): Promise<DatabaseResult<void>>;
|
|
113
|
+
query<T>(table: TableName, query: QueryOptions, operationConfig?: OperationConfig): Promise<DatabaseResult<PaginatedResult<T>>>;
|
|
114
|
+
count(table: TableName, filter?: Filter, operationConfig?: OperationConfig): Promise<DatabaseResult<number>>;
|
|
115
|
+
transaction<T>(fn: TransactionFn<T>): Promise<DatabaseResult<T>>;
|
|
116
|
+
setAuditContext(context: AuditContext): Promise<DatabaseResult<void>>;
|
|
117
|
+
on<T extends DatabaseEvent["type"]>(event: T, handler: (event: Extract<DatabaseEvent, {
|
|
118
|
+
type: T;
|
|
119
|
+
}>) => void | Promise<void>): void;
|
|
120
|
+
off<T extends DatabaseEvent["type"]>(event: T, handler: (event: Extract<DatabaseEvent, {
|
|
121
|
+
type: T;
|
|
122
|
+
}>) => void | Promise<void>): void;
|
|
123
|
+
healthCheck(): Promise<DatabaseResult<DatabaseHealthStatus>>;
|
|
124
|
+
getStatus(): ServiceStatus;
|
|
125
|
+
findById<T>(table: string, id: string): Promise<DatabaseResult<T | null>>;
|
|
126
|
+
findMany<T>(table: string, options?: QueryOptions): Promise<DatabaseResult<PaginatedResult<T>>>;
|
|
127
|
+
initialize(): Promise<DatabaseResult<void>>;
|
|
128
|
+
registerTable(): void;
|
|
129
|
+
exists(table: string, id: string): Promise<DatabaseResult<boolean>>;
|
|
130
|
+
private fireBeforeReadEvent;
|
|
131
|
+
private fireAfterReadEvent;
|
|
132
|
+
findOne<T>(table: TableName, filter: Filter, operationConfig?: OperationConfig): Promise<DatabaseResult<T | null>>;
|
|
133
|
+
softDelete(table: TableName, id: string, operationConfig?: OperationConfig): Promise<DatabaseResult<void>>;
|
|
134
|
+
get events(): DatabaseEventEmitter;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=DatabaseService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseService.d.ts","sourceRoot":"","sources":["../../src/service/DatabaseService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview DatabaseEventEmitter - Event management for database operations
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive event system for monitoring and reacting to database
|
|
5
|
+
* operations. The DatabaseEventEmitter implements the Observer pattern to enable
|
|
6
|
+
* decoupled monitoring of database activities, allowing multiple components to
|
|
7
|
+
* subscribe to and react to various database events.
|
|
8
|
+
*
|
|
9
|
+
* **Application Flow Context:**
|
|
10
|
+
* ```
|
|
11
|
+
* Database Operations → DatabaseEventEmitter → Event Handlers
|
|
12
|
+
* ↓ ↓ ↓
|
|
13
|
+
* Query Execution → Event Emission → Logging
|
|
14
|
+
* Transaction → Handler Dispatch → Monitoring
|
|
15
|
+
* Health Changes → Error Handling → Alerting
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* **Supported Events:**
|
|
19
|
+
* - **BeforeQuery**: Emitted before database queries
|
|
20
|
+
* - **AfterQuery**: Emitted after successful queries
|
|
21
|
+
* - **QueryError**: Emitted when queries fail
|
|
22
|
+
* - **BeforeTransaction**: Emitted before transactions start
|
|
23
|
+
* - **AfterTransaction**: Emitted after transactions complete
|
|
24
|
+
* - **TransactionRollback**: Emitted when transactions rollback
|
|
25
|
+
* - **HealthChange**: Emitted when database health status changes
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Event emitter setup
|
|
30
|
+
* const eventEmitter = new DatabaseEventEmitter('drizzle');
|
|
31
|
+
*
|
|
32
|
+
* // Subscribe to query events
|
|
33
|
+
* eventEmitter.on('BeforeQuery', (event) => {
|
|
34
|
+
* console.log(`Executing ${event.operation} on ${event.table}`);
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* eventEmitter.on('QueryError', (event) => {
|
|
38
|
+
* console.error(`Query failed: ${event.error.message}`);
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // Emit events during database operations
|
|
42
|
+
* eventEmitter.emitBeforeQuery('users', 'SELECT', { id: '123' });
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
import type { ContextType } from "@nestjs/common";
|
|
47
|
+
import type { DatabaseEvent, DatabaseOperationType, DBEventHandler } from "@plyaz/types";
|
|
48
|
+
import type { ADAPTERS } from "@plyaz/types";
|
|
49
|
+
/**
|
|
50
|
+
* Emit a query error event
|
|
51
|
+
*/
|
|
52
|
+
interface EmitQueryErrorOptions {
|
|
53
|
+
table: string;
|
|
54
|
+
operation: DatabaseOperationType;
|
|
55
|
+
error: Error;
|
|
56
|
+
params?: Record<string, object>;
|
|
57
|
+
context?: ContextType;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Event emitter for database events that implements the observer pattern.
|
|
61
|
+
* This class manages event subscriptions and emissions for various database operations,
|
|
62
|
+
* allowing decoupled monitoring of database activities.
|
|
63
|
+
*
|
|
64
|
+
* @class
|
|
65
|
+
* @implements {DatabaseEventEmitter}
|
|
66
|
+
*/
|
|
67
|
+
export declare class DatabaseEventEmitter implements DatabaseEventEmitter {
|
|
68
|
+
private readonly adapter;
|
|
69
|
+
private readonly eventHandlers;
|
|
70
|
+
constructor(adapter: ADAPTERS);
|
|
71
|
+
/**
|
|
72
|
+
* Register an event handler for a specific event type
|
|
73
|
+
*/
|
|
74
|
+
on<T extends DatabaseEvent>(eventType: T["type"], handler: DBEventHandler<T>): void;
|
|
75
|
+
/**
|
|
76
|
+
* Remove an event handler for a specific event type
|
|
77
|
+
*/
|
|
78
|
+
off<T extends DatabaseEvent>(eventType: T["type"], handler: DBEventHandler<T>): void;
|
|
79
|
+
/**
|
|
80
|
+
* Emit an event to all registered handlers
|
|
81
|
+
*/
|
|
82
|
+
emit(event: DatabaseEvent): void;
|
|
83
|
+
/**
|
|
84
|
+
* Emit a before query event
|
|
85
|
+
*/
|
|
86
|
+
emitBeforeQuery(table: string, operation: DatabaseOperationType, params?: Record<string, object>, context?: ContextType): void;
|
|
87
|
+
/**
|
|
88
|
+
* Emit an after query event
|
|
89
|
+
*/
|
|
90
|
+
emitAfterQuery(table: string, operation: DatabaseOperationType, duration: number, affectedRows?: number): void;
|
|
91
|
+
emitQueryError(options: EmitQueryErrorOptions): void;
|
|
92
|
+
/**
|
|
93
|
+
* Emit a before transaction event
|
|
94
|
+
*/
|
|
95
|
+
emitBeforeTransaction(transactionId: string, context?: ContextType): void;
|
|
96
|
+
/**
|
|
97
|
+
* Emit an after transaction event
|
|
98
|
+
*/
|
|
99
|
+
emitAfterTransaction(transactionId: string, duration: number): void;
|
|
100
|
+
/**
|
|
101
|
+
* Emit a transaction rollback event
|
|
102
|
+
*/
|
|
103
|
+
emitTransactionRollback(transactionId: string, error?: Error): void;
|
|
104
|
+
/**
|
|
105
|
+
* Emit a health change event
|
|
106
|
+
*/
|
|
107
|
+
emitHealthChange(previousStatus: boolean, currentStatus: boolean, details?: Record<string, string | number | boolean>): void;
|
|
108
|
+
}
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=EventEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../src/service/EventEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAKV,aAAa,EACb,qBAAqB,EACrB,cAAc,EAIf,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAM7C;;GAEG;AACH,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,YAAW,oBAAoB;IAInD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAClB;gBAEiB,OAAO,EAAE,QAAQ;IAa9C;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,aAAa,EACxB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,IAAI;IAuCP;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,aAAa,EACzB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,IAAI;IAQP;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IA6BhC;;OAEG;IACH,eAAe,CACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,qBAAqB,EAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,WAAW,GACpB,IAAI;IAaP;;OAEG;IACH,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,qBAAqB,EAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI;IAaP,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAiCpD;;OAEG;IACH,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IAWzE;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWnE;;OAEG;IACH,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAWnE;;OAEG;IACH,gBAAgB,CACd,cAAc,EAAE,OAAO,EACvB,aAAa,EAAE,OAAO,EACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAClD,IAAI;CAWR"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Health Manager for @plyaz/db package
|
|
3
|
+
*
|
|
4
|
+
* This module provides the HealthManager class responsible for monitoring database
|
|
5
|
+
* connection health, performing periodic health checks, and managing the lifecycle
|
|
6
|
+
* of database connections. It provides a centralized way to track database status.
|
|
7
|
+
*
|
|
8
|
+
* Part of the @plyaz/db package - a TypeScript database abstraction layer with
|
|
9
|
+
* support for multiple adapters (Drizzle, Supabase, SQL), extensions (audit, encryption,
|
|
10
|
+
* soft delete), and advanced features (caching, read replicas, multi-tenancy).
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
import type { DatabaseAdapterType, DatabaseHealthStatus, DatabaseResult } from "@plyaz/types/db";
|
|
14
|
+
/**
|
|
15
|
+
* 🌡️ HEALTH MANAGER - Database Health Monitoring
|
|
16
|
+
*
|
|
17
|
+
* Manages database health checks and monitoring functionality for all database adapters.
|
|
18
|
+
* This class is responsible for performing health checks on the database connection,
|
|
19
|
+
* storing the last known health status, and providing methods to quickly check
|
|
20
|
+
* the current health state of the database.
|
|
21
|
+
*
|
|
22
|
+
* **Application Flow Position:**
|
|
23
|
+
* DatabaseService → **HealthManager** → Adapter.healthCheck() → Database
|
|
24
|
+
*
|
|
25
|
+
* **What this class does:**
|
|
26
|
+
* 1. Initializes database connections on startup
|
|
27
|
+
* 2. Performs periodic health checks via adapter.healthCheck()
|
|
28
|
+
* 3. Caches last known health status for quick access
|
|
29
|
+
* 4. Normalizes health details across different adapters
|
|
30
|
+
* 5. Manages connection lifecycle (connect/disconnect)
|
|
31
|
+
*
|
|
32
|
+
* **Called by:** DatabaseService.healthCheck(), application health endpoints
|
|
33
|
+
* **Calls:** DatabaseAdapter.healthCheck(), DatabaseAdapter.connect/disconnect
|
|
34
|
+
* **Used for:** Application health monitoring, load balancer health checks
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // Create health manager with adapter
|
|
39
|
+
* const healthManager = new HealthManager(drizzleAdapter);
|
|
40
|
+
*
|
|
41
|
+
* // Initialize connection and perform initial health check
|
|
42
|
+
* await healthManager.init();
|
|
43
|
+
*
|
|
44
|
+
* // Perform health check
|
|
45
|
+
* const healthResult = await healthManager.checkHealth();
|
|
46
|
+
* if (healthResult.success) {
|
|
47
|
+
* console.log('Database is healthy:', healthResult.value);
|
|
48
|
+
* }
|
|
49
|
+
*
|
|
50
|
+
* // Quick health status check (uses cached result)
|
|
51
|
+
* const isHealthy = healthManager.isHealthy();
|
|
52
|
+
*
|
|
53
|
+
* // Get last known status without new check
|
|
54
|
+
* const lastStatus = healthManager.getLastHealthStatus();
|
|
55
|
+
*
|
|
56
|
+
* // Cleanup on shutdown
|
|
57
|
+
* await healthManager.shutdown();
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
export declare class HealthManager {
|
|
62
|
+
private readonly adapter;
|
|
63
|
+
private lastHealthStatus;
|
|
64
|
+
private initialized;
|
|
65
|
+
constructor(adapter: DatabaseAdapterType);
|
|
66
|
+
/**
|
|
67
|
+
* Initializes the health manager by establishing database connection and performing initial health check
|
|
68
|
+
*
|
|
69
|
+
* Sets up the database connection and performs an initial health check to establish
|
|
70
|
+
* baseline health status. This method should be called during application startup
|
|
71
|
+
* to ensure the database is ready for operations.
|
|
72
|
+
*
|
|
73
|
+
* **Initialization Process:**
|
|
74
|
+
* 1. Checks if already initialized (prevents double initialization)
|
|
75
|
+
* 2. Calls adapter.connect() if available (establishes connection)
|
|
76
|
+
* 3. Performs initial health check via checkHealth()
|
|
77
|
+
* 4. Sets initialized flag to prevent re-initialization
|
|
78
|
+
*
|
|
79
|
+
* @returns {Promise<void>} Promise that resolves when initialization is complete
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const healthManager = new HealthManager(adapter);
|
|
84
|
+
*
|
|
85
|
+
* // Initialize during application startup
|
|
86
|
+
* await healthManager.init();
|
|
87
|
+
* console.log('Health manager initialized');
|
|
88
|
+
*
|
|
89
|
+
* // Subsequent calls are no-ops
|
|
90
|
+
* await healthManager.init(); // Does nothing, already initialized
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
*/
|
|
94
|
+
init(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Performs a comprehensive health check on the database connection
|
|
97
|
+
*
|
|
98
|
+
* Executes a health check via the database adapter and normalizes the results
|
|
99
|
+
* into a standardized health status format. Measures response time and handles
|
|
100
|
+
* both successful and failed health checks gracefully.
|
|
101
|
+
*
|
|
102
|
+
* **Health Check Process:**
|
|
103
|
+
* 1. Records start time for response time measurement
|
|
104
|
+
* 2. Calls adapter.healthCheck() to test database connectivity
|
|
105
|
+
* 3. Normalizes adapter-specific response into standard format
|
|
106
|
+
* 4. Caches result as lastHealthStatus for quick access
|
|
107
|
+
* 5. Returns standardized DatabaseResult with health information
|
|
108
|
+
*
|
|
109
|
+
* **Health Status Fields:**
|
|
110
|
+
* - isHealthy: Boolean indicating if database is operational
|
|
111
|
+
* - responseTime: Time in milliseconds for health check to complete
|
|
112
|
+
* - details: Normalized adapter-specific details (connection info, errors, etc.)
|
|
113
|
+
*
|
|
114
|
+
* @returns {Promise<DatabaseResult<DatabaseHealthStatus>>} Promise resolving to health status result
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* // Perform health check
|
|
119
|
+
* const healthResult = await healthManager.checkHealth();
|
|
120
|
+
*
|
|
121
|
+
* if (healthResult.success) {
|
|
122
|
+
* const status = healthResult.value;
|
|
123
|
+
* console.log(`Database healthy: ${status.isHealthy}`);
|
|
124
|
+
* console.log(`Response time: ${status.responseTime}ms`);
|
|
125
|
+
* console.log('Details:', status.details);
|
|
126
|
+
* } else {
|
|
127
|
+
* console.error('Health check failed:', healthResult.error.message);
|
|
128
|
+
* }
|
|
129
|
+
*
|
|
130
|
+
* // Example healthy response:
|
|
131
|
+
* // {
|
|
132
|
+
* // success: true,
|
|
133
|
+
* // value: {
|
|
134
|
+
* // isHealthy: true,
|
|
135
|
+
* // responseTime: 45,
|
|
136
|
+
* // details: { adapter: "drizzle", connections: "5" }
|
|
137
|
+
* // }
|
|
138
|
+
* // }
|
|
139
|
+
*
|
|
140
|
+
* // Example unhealthy response:
|
|
141
|
+
* // {
|
|
142
|
+
* // success: true,
|
|
143
|
+
* // value: {
|
|
144
|
+
* // isHealthy: false,
|
|
145
|
+
* // responseTime: 5000,
|
|
146
|
+
* // details: { error: "Connection timeout" }
|
|
147
|
+
* // }
|
|
148
|
+
* // }
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
*/
|
|
152
|
+
checkHealth(): Promise<DatabaseResult<DatabaseHealthStatus>>;
|
|
153
|
+
/**
|
|
154
|
+
* Get the last known health status
|
|
155
|
+
*/
|
|
156
|
+
getLastHealthStatus(): DatabaseHealthStatus | null;
|
|
157
|
+
/**
|
|
158
|
+
* Check if the database is currently healthy
|
|
159
|
+
*/
|
|
160
|
+
isHealthy(): boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Gracefully shut down the health manager
|
|
163
|
+
*/
|
|
164
|
+
shutdown(): Promise<void>;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=HealthManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HealthManager.d.ts","sourceRoot":"","sources":["../../src/service/HealthManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACf,MAAM,iBAAiB,CAAC;AAMzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,WAAW,CAAS;gBAEC,OAAO,EAAE,mBAAmB;IAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwDG;IACG,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;IAsClE;;OAEG;IACH,mBAAmB,IAAI,oBAAoB,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAQhC"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuration Merger for @plyaz/db package
|
|
3
|
+
*
|
|
4
|
+
* This module provides the ConfigMerger utility class responsible for deep merging
|
|
5
|
+
* database configurations. It handles merging global database service configuration
|
|
6
|
+
* with per-operation overrides to create resolved configurations for the adapter chain.
|
|
7
|
+
*
|
|
8
|
+
* Part of the @plyaz/db package - a TypeScript database abstraction layer with
|
|
9
|
+
* support for multiple adapters (Drizzle, Supabase, SQL), extensions (audit, encryption,
|
|
10
|
+
* soft delete), and advanced features (caching, read replicas, multi-tenancy).
|
|
11
|
+
*/
|
|
12
|
+
import type { DatabaseServiceConfig, OperationConfig, ResolvedOperationConfig } from "@plyaz/types/db";
|
|
13
|
+
/**
|
|
14
|
+
* CONFIG MERGER - Configuration Resolution Engine
|
|
15
|
+
*
|
|
16
|
+
* Utility class for deep merging database configurations.
|
|
17
|
+
* Handles merging global database service configuration with per-operation overrides
|
|
18
|
+
*
|
|
19
|
+
* Application Flow Position:**
|
|
20
|
+
* DatabaseService → **ConfigMerger** → Resolved Config → Adapter Chain
|
|
21
|
+
*
|
|
22
|
+
* **What this class does:**
|
|
23
|
+
* 1. Receives global config (from createDatabaseService) and operation config (from method calls)
|
|
24
|
+
* 2. Deep merges nested objects (encryption, softDelete, cache, etc.)
|
|
25
|
+
* 3. Operation config takes precedence over global config
|
|
26
|
+
* 4. Returns resolved configuration for adapter chain
|
|
27
|
+
*
|
|
28
|
+
* **Called by:** DatabaseService methods (get, create, update, delete, etc.)
|
|
29
|
+
* **Calls:** Internal merge methods for each config section
|
|
30
|
+
* **Returns to:** DatabaseService for delegation to adapter chain
|
|
31
|
+
*
|
|
32
|
+
* **Merge Strategy:**
|
|
33
|
+
* - Operation config overrides global config
|
|
34
|
+
* - Nested objects are deep merged (not replaced)
|
|
35
|
+
* - Arrays use replace strategy for fields, concat for others
|
|
36
|
+
* - Undefined values in operation config fall back to global defaults
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ### Configuration Merging Flow
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Global config (from createDatabaseService)
|
|
42
|
+
* const globalConfig = {
|
|
43
|
+
* softDelete: { enabled: true, field: 'deletedAt' },
|
|
44
|
+
* cache: { enabled: true, ttl: 300 }
|
|
45
|
+
* };
|
|
46
|
+
*
|
|
47
|
+
* // Operation config (from method call)
|
|
48
|
+
* const operationConfig = {
|
|
49
|
+
* cache: { enabled: false },
|
|
50
|
+
* includeSoftDeleted: true
|
|
51
|
+
* };
|
|
52
|
+
*
|
|
53
|
+
* // ConfigMerger.mergeConfigs() produces:
|
|
54
|
+
* const resolved = {
|
|
55
|
+
* softDelete: { enabled: true, field: 'deletedAt' }, // From global
|
|
56
|
+
* cache: { enabled: false, ttl: 300 }, // Merged
|
|
57
|
+
* includeSoftDeleted: true, // From operation
|
|
58
|
+
* skipAudit: false // Default
|
|
59
|
+
* };
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare class ConfigMerger {
|
|
63
|
+
/**
|
|
64
|
+
* Merges global database configuration with operation-specific overrides
|
|
65
|
+
*
|
|
66
|
+
* This is the main entry point for configuration resolution in the DatabaseService.
|
|
67
|
+
* It performs deep merging of nested configuration objects while preserving type safety
|
|
68
|
+
* and applying proper precedence rules.
|
|
69
|
+
*
|
|
70
|
+
* **Merge Precedence (highest to lowest):**
|
|
71
|
+
* 1. Operation-specific config (method-level overrides)
|
|
72
|
+
* 2. Global service config (from createDatabaseService)
|
|
73
|
+
* 3. Default values (built-in fallbacks)
|
|
74
|
+
*
|
|
75
|
+
* **Configuration Sections Merged:**
|
|
76
|
+
* - softDelete: Logical deletion settings
|
|
77
|
+
* - encryption: Field-level encryption settings
|
|
78
|
+
* - cache: Caching behavior and TTL
|
|
79
|
+
* - timestamps: Automatic timestamp management
|
|
80
|
+
* - Operation flags: skipAudit, includeSoftDeleted, etc.
|
|
81
|
+
*
|
|
82
|
+
* @param {DatabaseServiceConfig} global - Global database service configuration from createDatabaseService()
|
|
83
|
+
* @param {OperationConfig} [operation] - Optional operation-specific configuration overrides
|
|
84
|
+
* @returns {ResolvedOperationConfig} Fully resolved configuration with all defaults applied
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* // In DatabaseService.get() method
|
|
89
|
+
* const resolvedConfig = ConfigMerger.mergeConfigs(
|
|
90
|
+
* this.globalConfig, // From createDatabaseService
|
|
91
|
+
* operationConfig // From method parameter
|
|
92
|
+
* );
|
|
93
|
+
*
|
|
94
|
+
* // Example global config
|
|
95
|
+
* const globalConfig = {
|
|
96
|
+
* softDelete: { enabled: true, field: 'deletedAt' },
|
|
97
|
+
* encryption: { enabled: true, fields: { users: ['ssn'] } },
|
|
98
|
+
* cache: { enabled: true, ttl: 300 }
|
|
99
|
+
* };
|
|
100
|
+
*
|
|
101
|
+
* // Example operation config (disable cache for this operation)
|
|
102
|
+
* const operationConfig = {
|
|
103
|
+
* cache: { enabled: false },
|
|
104
|
+
* skipAudit: true
|
|
105
|
+
* };
|
|
106
|
+
*
|
|
107
|
+
* // Resulting merged config
|
|
108
|
+
* const result = {
|
|
109
|
+
* softDelete: { enabled: true, field: 'deletedAt' }, // From global
|
|
110
|
+
* encryption: { enabled: true, fields: { users: ['ssn'] } }, // From global
|
|
111
|
+
* cache: { enabled: false, ttl: 300 }, // Merged (enabled overridden)
|
|
112
|
+
* timestamps: undefined, // Not specified
|
|
113
|
+
* skipAudit: true, // From operation
|
|
114
|
+
* includeSoftDeleted: false, // Default
|
|
115
|
+
* forceAdapter: undefined, // Not specified
|
|
116
|
+
* timeout: 30000 // Default
|
|
117
|
+
* };
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
120
|
+
*/
|
|
121
|
+
static mergeConfigs(global: DatabaseServiceConfig, operation?: OperationConfig): ResolvedOperationConfig;
|
|
122
|
+
/**
|
|
123
|
+
* Merges soft delete configuration with operation-specific overrides
|
|
124
|
+
*
|
|
125
|
+
* Handles deep merging of soft delete settings, allowing operation-level
|
|
126
|
+
* overrides while preserving base configuration values.
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @param {SoftDeleteConfig} [base] - Base soft delete configuration from global config
|
|
130
|
+
* @param {Partial<SoftDeleteConfig>} [override] - Operation-specific soft delete overrides
|
|
131
|
+
* @returns {SoftDeleteConfig | undefined} Merged soft delete configuration or undefined if neither provided
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* // Base config: { enabled: true, field: 'deletedAt', excludeTables: ['logs'] }
|
|
136
|
+
* // Override: { enabled: false }
|
|
137
|
+
* // Result: { enabled: false, field: 'deletedAt', excludeTables: ['logs'] }
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
*/
|
|
141
|
+
private static mergeSoftDeleteConfig;
|
|
142
|
+
/**
|
|
143
|
+
* Merges encryption configuration with operation-specific overrides
|
|
144
|
+
*
|
|
145
|
+
* Handles deep merging of field-level encryption settings, allowing operation-level
|
|
146
|
+
* overrides for encryption behavior while preserving base configuration.
|
|
147
|
+
*
|
|
148
|
+
* @private
|
|
149
|
+
* @param {DBEncryptionConfig} [base] - Base encryption configuration from global config
|
|
150
|
+
* @param {Partial<DBEncryptionConfig>} [override] - Operation-specific encryption overrides
|
|
151
|
+
* @returns {DBEncryptionConfig | undefined} Merged encryption configuration or undefined if neither provided
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* // Base config: { enabled: true, key: 'base64key', fields: { users: ['ssn'] } }
|
|
156
|
+
* // Override: { enabled: false }
|
|
157
|
+
* // Result: { enabled: false, key: 'base64key', fields: { users: ['ssn'] } }
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
*/
|
|
161
|
+
private static mergeEncryptionConfig;
|
|
162
|
+
/**
|
|
163
|
+
* Merges cache configuration with operation-specific overrides
|
|
164
|
+
*
|
|
165
|
+
* Handles deep merging of caching settings, allowing operation-level
|
|
166
|
+
* overrides for cache behavior (enable/disable, TTL changes, etc.).
|
|
167
|
+
*
|
|
168
|
+
* @private
|
|
169
|
+
* @param {DBCacheConfig} [base] - Base cache configuration from global config
|
|
170
|
+
* @param {Partial<DBCacheConfig>} [override] - Operation-specific cache overrides
|
|
171
|
+
* @returns {DBCacheConfig | undefined} Merged cache configuration or undefined if neither provided
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // Base config: { enabled: true, ttl: 300, provider: 'redis' }
|
|
176
|
+
* // Override: { enabled: false }
|
|
177
|
+
* // Result: { enabled: false, ttl: 300, provider: 'redis' }
|
|
178
|
+
* ```
|
|
179
|
+
*
|
|
180
|
+
|
|
181
|
+
*/
|
|
182
|
+
private static mergeCacheConfig;
|
|
183
|
+
/**
|
|
184
|
+
* Merges timestamps configuration with operation-specific overrides
|
|
185
|
+
*
|
|
186
|
+
* Handles deep merging of automatic timestamp settings, allowing operation-level
|
|
187
|
+
* overrides for timestamp field names and auto-update behavior.
|
|
188
|
+
*
|
|
189
|
+
* @private
|
|
190
|
+
* @param {TimestampsConfig} [base] - Base timestamps configuration from global config
|
|
191
|
+
* @param {Partial<TimestampsConfig>} [override] - Operation-specific timestamp overrides
|
|
192
|
+
* @returns {TimestampsConfig | undefined} Merged timestamps configuration or undefined if neither provided
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* // Base config: { enabled: true, createdAtField: 'createdAt', updatedAtField: 'updatedAt' }
|
|
197
|
+
* // Override: { autoUpdate: false }
|
|
198
|
+
* // Result: { enabled: true, createdAtField: 'createdAt', updatedAtField: 'updatedAt', autoUpdate: false }
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
private static mergeTimestampsConfig;
|
|
202
|
+
/**
|
|
203
|
+
* Converts global database service configuration to resolved operation configuration
|
|
204
|
+
*
|
|
205
|
+
* Used when no operation-specific overrides are provided. Applies default values
|
|
206
|
+
* for operation-specific flags while preserving global configuration settings.
|
|
207
|
+
*
|
|
208
|
+
* @private
|
|
209
|
+
* @param {DatabaseServiceConfig} global - Global database service configuration
|
|
210
|
+
* @returns {ResolvedOperationConfig} Resolved configuration with defaults applied
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* // Global config: { softDelete: { enabled: true }, cache: { enabled: true, ttl: 300 } }
|
|
215
|
+
* // Result: {
|
|
216
|
+
* // softDelete: { enabled: true },
|
|
217
|
+
* // cache: { enabled: true, ttl: 300 },
|
|
218
|
+
* // skipAudit: false, // Default
|
|
219
|
+
* // includeSoftDeleted: false, // Default
|
|
220
|
+
* // timeout: 30000 // Default
|
|
221
|
+
* // }
|
|
222
|
+
* ```
|
|
223
|
+
*
|
|
224
|
+
*/
|
|
225
|
+
private static convertGlobalToResolved;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=ConfigMerger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigMerger.d.ts","sourceRoot":"","sources":["../../src/utils/ConfigMerger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,qBAAqB,EAGrB,eAAe,EACf,uBAAuB,EAGxB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyDG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,qBAAqB,EAC7B,SAAS,CAAC,EAAE,eAAe,GAC1B,uBAAuB;IA0B1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAmBpC;;;;;;;;;;;;;;;;;;OAkBG;IAEH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAqBpC;;;;;;;;;;;;;;;;;;;OAmBG;IAEH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAoB/B;;;;;;;;;;;;;;;;;OAiBG;IAEH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAoBpC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAevC"}
|