@morojs/moro 1.0.0 → 1.0.1
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 +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +31 -30
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +180 -164
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +58 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Database MySQL Adapter
|
|
2
|
-
import { DatabaseAdapter, DatabaseTransaction } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
interface MySQLConfig {
|
|
6
6
|
host?: string;
|
|
@@ -13,24 +13,24 @@ interface MySQLConfig {
|
|
|
13
13
|
|
|
14
14
|
export class MySQLAdapter implements DatabaseAdapter {
|
|
15
15
|
private pool: any;
|
|
16
|
-
private logger = createFrameworkLogger(
|
|
16
|
+
private logger = createFrameworkLogger('MySQL');
|
|
17
17
|
|
|
18
18
|
constructor(config: MySQLConfig) {
|
|
19
19
|
try {
|
|
20
|
-
const mysql = require(
|
|
20
|
+
const mysql = require('mysql2/promise');
|
|
21
21
|
this.pool = mysql.createPool({
|
|
22
|
-
host: config.host ||
|
|
22
|
+
host: config.host || 'localhost',
|
|
23
23
|
port: config.port || 3306,
|
|
24
|
-
user: config.user ||
|
|
25
|
-
password: config.password ||
|
|
26
|
-
database: config.database ||
|
|
24
|
+
user: config.user || 'root',
|
|
25
|
+
password: config.password || '',
|
|
26
|
+
database: config.database || 'moro_app',
|
|
27
27
|
waitForConnections: true,
|
|
28
28
|
connectionLimit: config.connectionLimit || 10,
|
|
29
29
|
queueLimit: 0,
|
|
30
30
|
});
|
|
31
31
|
} catch (error) {
|
|
32
32
|
throw new Error(
|
|
33
|
-
|
|
33
|
+
'mysql2 package is required for MySQL adapter. Install it with: npm install mysql2'
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -39,9 +39,9 @@ export class MySQLAdapter implements DatabaseAdapter {
|
|
|
39
39
|
try {
|
|
40
40
|
const connection = await this.pool.getConnection();
|
|
41
41
|
connection.release();
|
|
42
|
-
this.logger.info(
|
|
42
|
+
this.logger.info('MySQL connection established', 'Connection');
|
|
43
43
|
} catch (error) {
|
|
44
|
-
this.logger.error(
|
|
44
|
+
this.logger.error('MySQL connection failed', 'Connection', {
|
|
45
45
|
error: error instanceof Error ? error.message : String(error),
|
|
46
46
|
});
|
|
47
47
|
throw error;
|
|
@@ -65,16 +65,15 @@ export class MySQLAdapter implements DatabaseAdapter {
|
|
|
65
65
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
66
66
|
const keys = Object.keys(data);
|
|
67
67
|
const values = Object.values(data);
|
|
68
|
-
const placeholders = keys.map(() =>
|
|
68
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
69
69
|
|
|
70
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
70
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;
|
|
71
71
|
const [result] = (await this.pool.execute(sql, values)) as any;
|
|
72
72
|
|
|
73
73
|
// Return the inserted record
|
|
74
|
-
const insertedRecord = await this.queryOne<T>(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
);
|
|
74
|
+
const insertedRecord = await this.queryOne<T>(`SELECT * FROM ${table} WHERE id = ?`, [
|
|
75
|
+
result.insertId,
|
|
76
|
+
]);
|
|
78
77
|
|
|
79
78
|
return insertedRecord!;
|
|
80
79
|
}
|
|
@@ -82,14 +81,14 @@ export class MySQLAdapter implements DatabaseAdapter {
|
|
|
82
81
|
async update<T = any>(
|
|
83
82
|
table: string,
|
|
84
83
|
data: Record<string, any>,
|
|
85
|
-
where: Record<string, any
|
|
84
|
+
where: Record<string, any>
|
|
86
85
|
): Promise<T> {
|
|
87
86
|
const setClause = Object.keys(data)
|
|
88
|
-
.map(
|
|
89
|
-
.join(
|
|
87
|
+
.map(key => `${key} = ?`)
|
|
88
|
+
.join(', ');
|
|
90
89
|
const whereClause = Object.keys(where)
|
|
91
|
-
.map(
|
|
92
|
-
.join(
|
|
90
|
+
.map(key => `${key} = ?`)
|
|
91
|
+
.join(' AND ');
|
|
93
92
|
|
|
94
93
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause}`;
|
|
95
94
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -99,7 +98,7 @@ export class MySQLAdapter implements DatabaseAdapter {
|
|
|
99
98
|
// Return the updated record
|
|
100
99
|
const updatedRecord = await this.queryOne<T>(
|
|
101
100
|
`SELECT * FROM ${table} WHERE ${whereClause}`,
|
|
102
|
-
Object.values(where)
|
|
101
|
+
Object.values(where)
|
|
103
102
|
);
|
|
104
103
|
|
|
105
104
|
return updatedRecord!;
|
|
@@ -107,20 +106,15 @@ export class MySQLAdapter implements DatabaseAdapter {
|
|
|
107
106
|
|
|
108
107
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
109
108
|
const whereClause = Object.keys(where)
|
|
110
|
-
.map(
|
|
111
|
-
.join(
|
|
109
|
+
.map(key => `${key} = ?`)
|
|
110
|
+
.join(' AND ');
|
|
112
111
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
113
112
|
|
|
114
|
-
const [result] = (await this.pool.execute(
|
|
115
|
-
sql,
|
|
116
|
-
Object.values(where),
|
|
117
|
-
)) as any;
|
|
113
|
+
const [result] = (await this.pool.execute(sql, Object.values(where))) as any;
|
|
118
114
|
return result.affectedRows;
|
|
119
115
|
}
|
|
120
116
|
|
|
121
|
-
async transaction<T>(
|
|
122
|
-
callback: (tx: DatabaseTransaction) => Promise<T>,
|
|
123
|
-
): Promise<T> {
|
|
117
|
+
async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
|
|
124
118
|
const connection = await this.pool.getConnection();
|
|
125
119
|
|
|
126
120
|
try {
|
|
@@ -156,15 +150,14 @@ class MySQLTransaction implements DatabaseTransaction {
|
|
|
156
150
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
157
151
|
const keys = Object.keys(data);
|
|
158
152
|
const values = Object.values(data);
|
|
159
|
-
const placeholders = keys.map(() =>
|
|
153
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
160
154
|
|
|
161
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
155
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;
|
|
162
156
|
const [result] = (await this.connection.execute(sql, values)) as any;
|
|
163
157
|
|
|
164
|
-
const insertedRecord = await this.queryOne<T>(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
);
|
|
158
|
+
const insertedRecord = await this.queryOne<T>(`SELECT * FROM ${table} WHERE id = ?`, [
|
|
159
|
+
result.insertId,
|
|
160
|
+
]);
|
|
168
161
|
|
|
169
162
|
return insertedRecord!;
|
|
170
163
|
}
|
|
@@ -172,14 +165,14 @@ class MySQLTransaction implements DatabaseTransaction {
|
|
|
172
165
|
async update<T = any>(
|
|
173
166
|
table: string,
|
|
174
167
|
data: Record<string, any>,
|
|
175
|
-
where: Record<string, any
|
|
168
|
+
where: Record<string, any>
|
|
176
169
|
): Promise<T> {
|
|
177
170
|
const setClause = Object.keys(data)
|
|
178
|
-
.map(
|
|
179
|
-
.join(
|
|
171
|
+
.map(key => `${key} = ?`)
|
|
172
|
+
.join(', ');
|
|
180
173
|
const whereClause = Object.keys(where)
|
|
181
|
-
.map(
|
|
182
|
-
.join(
|
|
174
|
+
.map(key => `${key} = ?`)
|
|
175
|
+
.join(' AND ');
|
|
183
176
|
|
|
184
177
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause}`;
|
|
185
178
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -188,7 +181,7 @@ class MySQLTransaction implements DatabaseTransaction {
|
|
|
188
181
|
|
|
189
182
|
const updatedRecord = await this.queryOne<T>(
|
|
190
183
|
`SELECT * FROM ${table} WHERE ${whereClause}`,
|
|
191
|
-
Object.values(where)
|
|
184
|
+
Object.values(where)
|
|
192
185
|
);
|
|
193
186
|
|
|
194
187
|
return updatedRecord!;
|
|
@@ -196,14 +189,11 @@ class MySQLTransaction implements DatabaseTransaction {
|
|
|
196
189
|
|
|
197
190
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
198
191
|
const whereClause = Object.keys(where)
|
|
199
|
-
.map(
|
|
200
|
-
.join(
|
|
192
|
+
.map(key => `${key} = ?`)
|
|
193
|
+
.join(' AND ');
|
|
201
194
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
202
195
|
|
|
203
|
-
const [result] = (await this.connection.execute(
|
|
204
|
-
sql,
|
|
205
|
-
Object.values(where),
|
|
206
|
-
)) as any;
|
|
196
|
+
const [result] = (await this.connection.execute(sql, Object.values(where))) as any;
|
|
207
197
|
return result.affectedRows;
|
|
208
198
|
}
|
|
209
199
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Database PostgreSQL Adapter
|
|
2
|
-
import { DatabaseAdapter, DatabaseTransaction } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
interface PostgreSQLConfig {
|
|
6
6
|
host?: string;
|
|
@@ -14,31 +14,31 @@ interface PostgreSQLConfig {
|
|
|
14
14
|
|
|
15
15
|
export class PostgreSQLAdapter implements DatabaseAdapter {
|
|
16
16
|
private pool: any;
|
|
17
|
-
private logger = createFrameworkLogger(
|
|
17
|
+
private logger = createFrameworkLogger('PostgreSQL');
|
|
18
18
|
|
|
19
19
|
constructor(config: PostgreSQLConfig) {
|
|
20
20
|
try {
|
|
21
|
-
const { Pool } = require(
|
|
21
|
+
const { Pool } = require('pg');
|
|
22
22
|
this.pool = new Pool({
|
|
23
|
-
host: config.host ||
|
|
23
|
+
host: config.host || 'localhost',
|
|
24
24
|
port: config.port || 5432,
|
|
25
|
-
user: config.user ||
|
|
26
|
-
password: config.password ||
|
|
27
|
-
database: config.database ||
|
|
25
|
+
user: config.user || 'postgres',
|
|
26
|
+
password: config.password || '',
|
|
27
|
+
database: config.database || 'moro_app',
|
|
28
28
|
max: config.connectionLimit || 10,
|
|
29
29
|
ssl: config.ssl || false,
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
this.pool.on(
|
|
33
|
-
this.logger.error(
|
|
32
|
+
this.pool.on('error', (err: Error) => {
|
|
33
|
+
this.logger.error('PostgreSQL pool error', 'Pool', {
|
|
34
34
|
error: err.message,
|
|
35
35
|
});
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
-
this.logger.info(
|
|
38
|
+
this.logger.info('PostgreSQL adapter initialized', 'PostgreSQL');
|
|
39
39
|
} catch (error) {
|
|
40
40
|
throw new Error(
|
|
41
|
-
|
|
41
|
+
'pg package is required for PostgreSQL adapter. Install it with: npm install pg'
|
|
42
42
|
);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -47,9 +47,9 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
|
|
|
47
47
|
try {
|
|
48
48
|
const client = await this.pool.connect();
|
|
49
49
|
client.release();
|
|
50
|
-
this.logger.info(
|
|
50
|
+
this.logger.info('PostgreSQL connection established', 'Connection');
|
|
51
51
|
} catch (error) {
|
|
52
|
-
this.logger.error(
|
|
52
|
+
this.logger.error('PostgreSQL connection failed', 'Connection', {
|
|
53
53
|
error: error instanceof Error ? error.message : String(error),
|
|
54
54
|
});
|
|
55
55
|
throw error;
|
|
@@ -73,9 +73,9 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
|
|
|
73
73
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
74
74
|
const keys = Object.keys(data);
|
|
75
75
|
const values = Object.values(data);
|
|
76
|
-
const placeholders = keys.map((_, index) => `$${index + 1}`).join(
|
|
76
|
+
const placeholders = keys.map((_, index) => `$${index + 1}`).join(', ');
|
|
77
77
|
|
|
78
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
78
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) RETURNING *`;
|
|
79
79
|
const result = await this.pool.query(sql, values);
|
|
80
80
|
|
|
81
81
|
return result.rows[0] as T;
|
|
@@ -84,19 +84,17 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
|
|
|
84
84
|
async update<T = any>(
|
|
85
85
|
table: string,
|
|
86
86
|
data: Record<string, any>,
|
|
87
|
-
where: Record<string, any
|
|
87
|
+
where: Record<string, any>
|
|
88
88
|
): Promise<T> {
|
|
89
89
|
const dataKeys = Object.keys(data);
|
|
90
90
|
const dataValues = Object.values(data);
|
|
91
91
|
const whereKeys = Object.keys(where);
|
|
92
92
|
const whereValues = Object.values(where);
|
|
93
93
|
|
|
94
|
-
const setClause = dataKeys
|
|
95
|
-
.map((key, index) => `${key} = $${index + 1}`)
|
|
96
|
-
.join(", ");
|
|
94
|
+
const setClause = dataKeys.map((key, index) => `${key} = $${index + 1}`).join(', ');
|
|
97
95
|
const whereClause = whereKeys
|
|
98
96
|
.map((key, index) => `${key} = $${dataKeys.length + index + 1}`)
|
|
99
|
-
.join(
|
|
97
|
+
.join(' AND ');
|
|
100
98
|
|
|
101
99
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
|
|
102
100
|
const params = [...dataValues, ...whereValues];
|
|
@@ -108,9 +106,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
|
|
|
108
106
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
109
107
|
const whereKeys = Object.keys(where);
|
|
110
108
|
const whereValues = Object.values(where);
|
|
111
|
-
const whereClause = whereKeys
|
|
112
|
-
.map((key, index) => `${key} = $${index + 1}`)
|
|
113
|
-
.join(" AND ");
|
|
109
|
+
const whereClause = whereKeys.map((key, index) => `${key} = $${index + 1}`).join(' AND ');
|
|
114
110
|
|
|
115
111
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
116
112
|
const result = await this.pool.query(sql, whereValues);
|
|
@@ -118,21 +114,19 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
|
|
|
118
114
|
return result.rowCount || 0;
|
|
119
115
|
}
|
|
120
116
|
|
|
121
|
-
async transaction<T>(
|
|
122
|
-
callback: (tx: DatabaseTransaction) => Promise<T>,
|
|
123
|
-
): Promise<T> {
|
|
117
|
+
async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
|
|
124
118
|
const client = await this.pool.connect();
|
|
125
119
|
|
|
126
120
|
try {
|
|
127
|
-
await client.query(
|
|
121
|
+
await client.query('BEGIN');
|
|
128
122
|
|
|
129
123
|
const transaction = new PostgreSQLTransaction(client);
|
|
130
124
|
const result = await callback(transaction);
|
|
131
125
|
|
|
132
|
-
await client.query(
|
|
126
|
+
await client.query('COMMIT');
|
|
133
127
|
return result;
|
|
134
128
|
} catch (error) {
|
|
135
|
-
await client.query(
|
|
129
|
+
await client.query('ROLLBACK');
|
|
136
130
|
throw error;
|
|
137
131
|
} finally {
|
|
138
132
|
client.release();
|
|
@@ -156,9 +150,9 @@ class PostgreSQLTransaction implements DatabaseTransaction {
|
|
|
156
150
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
157
151
|
const keys = Object.keys(data);
|
|
158
152
|
const values = Object.values(data);
|
|
159
|
-
const placeholders = keys.map((_, index) => `$${index + 1}`).join(
|
|
153
|
+
const placeholders = keys.map((_, index) => `$${index + 1}`).join(', ');
|
|
160
154
|
|
|
161
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
155
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) RETURNING *`;
|
|
162
156
|
const result = await this.client.query(sql, values);
|
|
163
157
|
|
|
164
158
|
return result.rows[0] as T;
|
|
@@ -167,19 +161,17 @@ class PostgreSQLTransaction implements DatabaseTransaction {
|
|
|
167
161
|
async update<T = any>(
|
|
168
162
|
table: string,
|
|
169
163
|
data: Record<string, any>,
|
|
170
|
-
where: Record<string, any
|
|
164
|
+
where: Record<string, any>
|
|
171
165
|
): Promise<T> {
|
|
172
166
|
const dataKeys = Object.keys(data);
|
|
173
167
|
const dataValues = Object.values(data);
|
|
174
168
|
const whereKeys = Object.keys(where);
|
|
175
169
|
const whereValues = Object.values(where);
|
|
176
170
|
|
|
177
|
-
const setClause = dataKeys
|
|
178
|
-
.map((key, index) => `${key} = $${index + 1}`)
|
|
179
|
-
.join(", ");
|
|
171
|
+
const setClause = dataKeys.map((key, index) => `${key} = $${index + 1}`).join(', ');
|
|
180
172
|
const whereClause = whereKeys
|
|
181
173
|
.map((key, index) => `${key} = $${dataKeys.length + index + 1}`)
|
|
182
|
-
.join(
|
|
174
|
+
.join(' AND ');
|
|
183
175
|
|
|
184
176
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
|
|
185
177
|
const params = [...dataValues, ...whereValues];
|
|
@@ -191,9 +183,7 @@ class PostgreSQLTransaction implements DatabaseTransaction {
|
|
|
191
183
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
192
184
|
const whereKeys = Object.keys(where);
|
|
193
185
|
const whereValues = Object.values(where);
|
|
194
|
-
const whereClause = whereKeys
|
|
195
|
-
.map((key, index) => `${key} = $${index + 1}`)
|
|
196
|
-
.join(" AND ");
|
|
186
|
+
const whereClause = whereKeys.map((key, index) => `${key} = $${index + 1}`).join(' AND ');
|
|
197
187
|
|
|
198
188
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
199
189
|
const result = await this.client.query(sql, whereValues);
|
|
@@ -202,10 +192,10 @@ class PostgreSQLTransaction implements DatabaseTransaction {
|
|
|
202
192
|
}
|
|
203
193
|
|
|
204
194
|
async commit(): Promise<void> {
|
|
205
|
-
await this.client.query(
|
|
195
|
+
await this.client.query('COMMIT');
|
|
206
196
|
}
|
|
207
197
|
|
|
208
198
|
async rollback(): Promise<void> {
|
|
209
|
-
await this.client.query(
|
|
199
|
+
await this.client.query('ROLLBACK');
|
|
210
200
|
}
|
|
211
201
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Database Redis Adapter
|
|
2
|
-
import { DatabaseAdapter, DatabaseTransaction } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
interface RedisConfig {
|
|
6
6
|
host?: string;
|
|
@@ -20,13 +20,13 @@ interface RedisConfig {
|
|
|
20
20
|
|
|
21
21
|
export class RedisAdapter implements DatabaseAdapter {
|
|
22
22
|
private client: any;
|
|
23
|
-
private logger = createFrameworkLogger(
|
|
23
|
+
private logger = createFrameworkLogger('Redis');
|
|
24
24
|
private keyPrefix: string;
|
|
25
25
|
|
|
26
26
|
constructor(config: RedisConfig = {}) {
|
|
27
27
|
try {
|
|
28
|
-
const Redis = require(
|
|
29
|
-
this.keyPrefix = config.keyPrefix ||
|
|
28
|
+
const Redis = require('ioredis');
|
|
29
|
+
this.keyPrefix = config.keyPrefix || 'moro:';
|
|
30
30
|
|
|
31
31
|
if (config.cluster) {
|
|
32
32
|
// Redis Cluster
|
|
@@ -37,7 +37,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
37
37
|
} else {
|
|
38
38
|
// Single Redis instance
|
|
39
39
|
this.client = new Redis({
|
|
40
|
-
host: config.host ||
|
|
40
|
+
host: config.host || 'localhost',
|
|
41
41
|
port: config.port || 6379,
|
|
42
42
|
password: config.password,
|
|
43
43
|
db: config.db || 0,
|
|
@@ -47,24 +47,24 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
this.client.on(
|
|
51
|
-
this.logger.error(
|
|
50
|
+
this.client.on('error', (err: Error) => {
|
|
51
|
+
this.logger.error('Redis client error', 'Redis', {
|
|
52
52
|
error: err.message,
|
|
53
53
|
});
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
this.client.on(
|
|
57
|
-
this.logger.info(
|
|
56
|
+
this.client.on('connect', () => {
|
|
57
|
+
this.logger.info('Redis connected', 'Connection');
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
this.client.on(
|
|
61
|
-
this.logger.warn(
|
|
60
|
+
this.client.on('disconnect', () => {
|
|
61
|
+
this.logger.warn('Redis disconnected', 'Connection');
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
-
this.logger.info(
|
|
64
|
+
this.logger.info('Redis adapter initialized', 'Redis');
|
|
65
65
|
} catch (error) {
|
|
66
66
|
throw new Error(
|
|
67
|
-
|
|
67
|
+
'ioredis package is required for Redis adapter. Install it with: npm install ioredis'
|
|
68
68
|
);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -76,9 +76,9 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
76
76
|
async connect(): Promise<void> {
|
|
77
77
|
try {
|
|
78
78
|
await this.client.ping();
|
|
79
|
-
this.logger.info(
|
|
79
|
+
this.logger.info('Redis connection established', 'Connection');
|
|
80
80
|
} catch (error) {
|
|
81
|
-
this.logger.error(
|
|
81
|
+
this.logger.error('Redis connection failed', 'Connection', {
|
|
82
82
|
error: error instanceof Error ? error.message : String(error),
|
|
83
83
|
});
|
|
84
84
|
throw error;
|
|
@@ -97,11 +97,11 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
97
97
|
|
|
98
98
|
const values = await this.client.mget(keys);
|
|
99
99
|
return values.map((value: string, index: number) => ({
|
|
100
|
-
key: keys[index].replace(this.keyPrefix,
|
|
100
|
+
key: keys[index].replace(this.keyPrefix, ''),
|
|
101
101
|
value: value ? JSON.parse(value) : null,
|
|
102
102
|
}));
|
|
103
103
|
} catch (error) {
|
|
104
|
-
this.logger.error(
|
|
104
|
+
this.logger.error('Redis query failed', 'Query', {
|
|
105
105
|
pattern,
|
|
106
106
|
error: error instanceof Error ? error.message : String(error),
|
|
107
107
|
});
|
|
@@ -114,7 +114,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
114
114
|
const value = await this.client.get(this.prefixKey(key));
|
|
115
115
|
return value ? JSON.parse(value) : null;
|
|
116
116
|
} catch (error) {
|
|
117
|
-
this.logger.error(
|
|
117
|
+
this.logger.error('Redis queryOne failed', 'Query', {
|
|
118
118
|
key,
|
|
119
119
|
error: error instanceof Error ? error.message : String(error),
|
|
120
120
|
});
|
|
@@ -128,7 +128,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
128
128
|
await this.client.set(this.prefixKey(key), value);
|
|
129
129
|
return data as T;
|
|
130
130
|
} catch (error) {
|
|
131
|
-
this.logger.error(
|
|
131
|
+
this.logger.error('Redis insert failed', 'Insert', {
|
|
132
132
|
key,
|
|
133
133
|
error: error instanceof Error ? error.message : String(error),
|
|
134
134
|
});
|
|
@@ -139,7 +139,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
139
139
|
async update<T = any>(
|
|
140
140
|
key: string,
|
|
141
141
|
data: Record<string, any>,
|
|
142
|
-
_where?: Record<string, any
|
|
142
|
+
_where?: Record<string, any>
|
|
143
143
|
): Promise<T> {
|
|
144
144
|
try {
|
|
145
145
|
// For Redis, we'll merge with existing data if it exists
|
|
@@ -149,7 +149,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
149
149
|
await this.client.set(this.prefixKey(key), value);
|
|
150
150
|
return merged as T;
|
|
151
151
|
} catch (error) {
|
|
152
|
-
this.logger.error(
|
|
152
|
+
this.logger.error('Redis update failed', 'Update', {
|
|
153
153
|
key,
|
|
154
154
|
error: error instanceof Error ? error.message : String(error),
|
|
155
155
|
});
|
|
@@ -165,7 +165,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
165
165
|
const deletedCount = await this.client.del(...keys);
|
|
166
166
|
return deletedCount;
|
|
167
167
|
} catch (error) {
|
|
168
|
-
this.logger.error(
|
|
168
|
+
this.logger.error('Redis delete failed', 'Delete', {
|
|
169
169
|
pattern,
|
|
170
170
|
error: error instanceof Error ? error.message : String(error),
|
|
171
171
|
});
|
|
@@ -173,9 +173,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
async transaction<T>(
|
|
177
|
-
callback: (tx: DatabaseTransaction) => Promise<T>,
|
|
178
|
-
): Promise<T> {
|
|
176
|
+
async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
|
|
179
177
|
const multi = this.client.multi();
|
|
180
178
|
const transaction = new RedisTransaction(multi, this.keyPrefix);
|
|
181
179
|
|
|
@@ -242,7 +240,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
242
240
|
}
|
|
243
241
|
|
|
244
242
|
async lpush(list: string, ...values: any[]): Promise<number> {
|
|
245
|
-
const serialized = values.map(
|
|
243
|
+
const serialized = values.map(v => JSON.stringify(v));
|
|
246
244
|
return await this.client.lpush(this.prefixKey(list), ...serialized);
|
|
247
245
|
}
|
|
248
246
|
|
|
@@ -260,13 +258,10 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
260
258
|
return await this.client.publish(channel, JSON.stringify(message));
|
|
261
259
|
}
|
|
262
260
|
|
|
263
|
-
async subscribe(
|
|
264
|
-
channel: string,
|
|
265
|
-
callback: (message: any) => void,
|
|
266
|
-
): Promise<void> {
|
|
261
|
+
async subscribe(channel: string, callback: (message: any) => void): Promise<void> {
|
|
267
262
|
const subscriber = this.client.duplicate();
|
|
268
263
|
subscriber.subscribe(channel);
|
|
269
|
-
subscriber.on(
|
|
264
|
+
subscriber.on('message', (_channel: string, message: string) => {
|
|
270
265
|
callback(JSON.parse(message));
|
|
271
266
|
});
|
|
272
267
|
}
|
|
@@ -279,7 +274,7 @@ export class RedisAdapter implements DatabaseAdapter {
|
|
|
279
274
|
class RedisTransaction implements DatabaseTransaction {
|
|
280
275
|
constructor(
|
|
281
276
|
private multi: any,
|
|
282
|
-
private keyPrefix: string
|
|
277
|
+
private keyPrefix: string
|
|
283
278
|
) {}
|
|
284
279
|
|
|
285
280
|
private prefixKey(key: string): string {
|
|
@@ -290,13 +285,13 @@ class RedisTransaction implements DatabaseTransaction {
|
|
|
290
285
|
// Note: Redis transactions can't perform read operations during MULTI
|
|
291
286
|
// This is a limitation of Redis transactions
|
|
292
287
|
throw new Error(
|
|
293
|
-
|
|
288
|
+
'Redis transactions cannot perform read operations. Use regular operations instead.'
|
|
294
289
|
);
|
|
295
290
|
}
|
|
296
291
|
|
|
297
292
|
async queryOne<T = any>(_key: string, _params?: any[]): Promise<T | null> {
|
|
298
293
|
throw new Error(
|
|
299
|
-
|
|
294
|
+
'Redis transactions cannot perform read operations. Use regular operations instead.'
|
|
300
295
|
);
|
|
301
296
|
}
|
|
302
297
|
|
|
@@ -309,7 +304,7 @@ class RedisTransaction implements DatabaseTransaction {
|
|
|
309
304
|
async update<T = any>(
|
|
310
305
|
key: string,
|
|
311
306
|
data: Record<string, any>,
|
|
312
|
-
_where?: Record<string, any
|
|
307
|
+
_where?: Record<string, any>
|
|
313
308
|
): Promise<T> {
|
|
314
309
|
const value = JSON.stringify(data);
|
|
315
310
|
this.multi.set(this.prefixKey(key), value);
|