@truto/ginger 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +597 -0
- package/dist/adapters/bun-sqlite.d.ts +37 -0
- package/dist/adapters/bun-sqlite.d.ts.map +1 -0
- package/dist/adapters/bun-sqlite.js +136 -0
- package/dist/adapters/bun-sqlite.js.map +1 -0
- package/dist/adapters/durable-object.d.ts +40 -0
- package/dist/adapters/durable-object.d.ts.map +1 -0
- package/dist/adapters/durable-object.js +142 -0
- package/dist/adapters/durable-object.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/crypto.d.ts +40 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +148 -0
- package/dist/crypto.js.map +1 -0
- package/dist/errors.d.ts +64 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +90 -0
- package/dist/errors.js.map +1 -0
- package/dist/example.d.ts +119 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +297 -0
- package/dist/example.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/pagination.d.ts +31 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +173 -0
- package/dist/pagination.js.map +1 -0
- package/dist/service.d.ts +81 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +615 -0
- package/dist/service.js.map +1 -0
- package/dist/sql-builder.d.ts +48 -0
- package/dist/sql-builder.d.ts.map +1 -0
- package/dist/sql-builder.js +230 -0
- package/dist/sql-builder.js.map +1 -0
- package/dist/types.d.ts +266 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +94 -0
package/dist/service.js
ADDED
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
import { sql } from '@truto/sqlite-builder';
|
|
2
|
+
import { decryptSecrets, DefaultKeyProvider, encryptSecrets } from './crypto.js';
|
|
3
|
+
import { DatabaseError, HookError, NotFoundError, ValidationError, } from './errors.js';
|
|
4
|
+
import { buildCursorConditions, createCursor, decodeCursor, encodeCursor, getDefaultOrderBy, reverseOrderBy, validateOrderBy, } from './pagination.js';
|
|
5
|
+
import { buildCount, buildDelete, buildInsert, buildSelect, buildSelectById, buildUpdate, } from './sql-builder.js';
|
|
6
|
+
/**
|
|
7
|
+
* Main service class that provides type-safe data access for SQLite databases
|
|
8
|
+
*/
|
|
9
|
+
export class Service {
|
|
10
|
+
table;
|
|
11
|
+
db;
|
|
12
|
+
rowSchema;
|
|
13
|
+
createSchema;
|
|
14
|
+
updateSchema;
|
|
15
|
+
joins;
|
|
16
|
+
secrets;
|
|
17
|
+
primaryKey;
|
|
18
|
+
defaultOrderBy;
|
|
19
|
+
keyProvider;
|
|
20
|
+
deps;
|
|
21
|
+
hooks;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.table = options.table;
|
|
24
|
+
this.db = options.db;
|
|
25
|
+
this.rowSchema = options.rowSchema;
|
|
26
|
+
this.createSchema = options.createSchema;
|
|
27
|
+
this.updateSchema = options.updateSchema;
|
|
28
|
+
this.joins = options.joins;
|
|
29
|
+
this.secrets = options.secrets;
|
|
30
|
+
this.hooks = options.hooks || {};
|
|
31
|
+
this.deps = options.deps || {};
|
|
32
|
+
this.primaryKey = options.primaryKey || 'id';
|
|
33
|
+
this.defaultOrderBy = options.defaultOrderBy;
|
|
34
|
+
this.keyProvider =
|
|
35
|
+
options.keyProvider ||
|
|
36
|
+
new DefaultKeyProvider(options.encryptionKeys || {});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* List records with cursor-based pagination
|
|
40
|
+
*/
|
|
41
|
+
async list(params = { auth: {} }) {
|
|
42
|
+
const ctx = {
|
|
43
|
+
auth: params.auth,
|
|
44
|
+
db: this.db,
|
|
45
|
+
deps: this.deps,
|
|
46
|
+
method: 'list',
|
|
47
|
+
params,
|
|
48
|
+
};
|
|
49
|
+
try {
|
|
50
|
+
await this.runHooks('before', 'list', ctx);
|
|
51
|
+
const { cursor, limit = 50, orderBy: paramOrderBy, where = {}, include = {}, includeSecrets = false, } = params;
|
|
52
|
+
// Validate limit
|
|
53
|
+
if (limit > 1000) {
|
|
54
|
+
throw new ValidationError('Limit cannot exceed 1000');
|
|
55
|
+
}
|
|
56
|
+
// Determine order by
|
|
57
|
+
let orderBy = paramOrderBy || getDefaultOrderBy(this.primaryKey, this.defaultOrderBy);
|
|
58
|
+
// Validate order by columns
|
|
59
|
+
const allowedColumns = this.getAllowedColumns();
|
|
60
|
+
validateOrderBy(orderBy, allowedColumns);
|
|
61
|
+
// Handle cursor pagination
|
|
62
|
+
let cursorConditions;
|
|
63
|
+
let actualLimit = limit + 1; // Fetch one extra to determine if there's a next page
|
|
64
|
+
if (cursor) {
|
|
65
|
+
try {
|
|
66
|
+
const cursorToken = decodeCursor(cursor);
|
|
67
|
+
// Use cursor's orderBy if present
|
|
68
|
+
if (cursorToken.orderBy.length > 0) {
|
|
69
|
+
orderBy =
|
|
70
|
+
cursorToken.direction === 'prev'
|
|
71
|
+
? reverseOrderBy(cursorToken.orderBy)
|
|
72
|
+
: cursorToken.orderBy;
|
|
73
|
+
}
|
|
74
|
+
cursorConditions = buildCursorConditions(cursorToken, this.table);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new ValidationError(`Invalid cursor: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Get columns to select (excluding secret columns if not requested)
|
|
81
|
+
const columns = this.getSelectColumns(includeSecrets);
|
|
82
|
+
// Build and execute query
|
|
83
|
+
const { text: query, values: sqlParams } = buildSelect(this.table, {
|
|
84
|
+
columns,
|
|
85
|
+
where,
|
|
86
|
+
...(this.joins ? { joins: this.joins } : {}),
|
|
87
|
+
include,
|
|
88
|
+
orderBy,
|
|
89
|
+
limit: actualLimit,
|
|
90
|
+
...(cursorConditions ? { cursorConditions } : {}),
|
|
91
|
+
});
|
|
92
|
+
const stmt = this.db.prepare(query);
|
|
93
|
+
const result = await stmt.bind(...sqlParams).all();
|
|
94
|
+
if (!result.success) {
|
|
95
|
+
throw new DatabaseError('Failed to execute list query');
|
|
96
|
+
}
|
|
97
|
+
let rows = result.results || [];
|
|
98
|
+
// Process results
|
|
99
|
+
const hasNextPage = rows.length > limit;
|
|
100
|
+
if (hasNextPage) {
|
|
101
|
+
rows = rows.slice(0, limit); // Remove the extra row
|
|
102
|
+
}
|
|
103
|
+
// Decrypt secrets if requested
|
|
104
|
+
if (includeSecrets && this.secrets) {
|
|
105
|
+
rows = await Promise.all(rows.map((row) => this.decryptRowSecrets(row)));
|
|
106
|
+
}
|
|
107
|
+
// Process joins
|
|
108
|
+
const processedRows = this.processJoinedRows(rows, include);
|
|
109
|
+
// Validate rows
|
|
110
|
+
const validatedRows = processedRows.map((row) => this.rowSchema.parse(row));
|
|
111
|
+
// Generate cursors
|
|
112
|
+
let nextCursor;
|
|
113
|
+
let prevCursor;
|
|
114
|
+
if (validatedRows.length > 0) {
|
|
115
|
+
if (hasNextPage) {
|
|
116
|
+
const lastRow = validatedRows[validatedRows.length - 1];
|
|
117
|
+
nextCursor = encodeCursor(createCursor(lastRow, orderBy, 'next'));
|
|
118
|
+
}
|
|
119
|
+
if (cursor) {
|
|
120
|
+
const firstRow = validatedRows[0];
|
|
121
|
+
prevCursor = encodeCursor(createCursor(firstRow, orderBy, 'prev'));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const listResult = {
|
|
125
|
+
result: validatedRows,
|
|
126
|
+
nextCursor,
|
|
127
|
+
prevCursor,
|
|
128
|
+
};
|
|
129
|
+
ctx.result = listResult;
|
|
130
|
+
await this.runHooks('after', 'list', ctx);
|
|
131
|
+
return listResult;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
ctx.error = error;
|
|
135
|
+
await this.runHooks('error', 'list', ctx);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get a single record by ID
|
|
141
|
+
*/
|
|
142
|
+
async get(id, opts = { auth: {} }) {
|
|
143
|
+
const ctx = {
|
|
144
|
+
auth: opts.auth,
|
|
145
|
+
db: this.db,
|
|
146
|
+
deps: this.deps,
|
|
147
|
+
method: 'get',
|
|
148
|
+
params: { id, ...opts },
|
|
149
|
+
};
|
|
150
|
+
try {
|
|
151
|
+
await this.runHooks('before', 'get', ctx);
|
|
152
|
+
const { include = {}, includeSecrets = false } = opts;
|
|
153
|
+
// Get columns to select
|
|
154
|
+
const columns = this.getSelectColumns(includeSecrets);
|
|
155
|
+
// Build and execute query
|
|
156
|
+
const { text: query, values: params } = buildSelectById(this.table, this.primaryKey, id, {
|
|
157
|
+
columns,
|
|
158
|
+
...(this.joins ? { joins: this.joins } : {}),
|
|
159
|
+
include,
|
|
160
|
+
});
|
|
161
|
+
const stmt = this.db.prepare(query);
|
|
162
|
+
const result = await stmt.bind(...params).first();
|
|
163
|
+
if (!result) {
|
|
164
|
+
ctx.result = null;
|
|
165
|
+
await this.runHooks('after', 'get', ctx);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
let row = result;
|
|
169
|
+
// Decrypt secrets if requested
|
|
170
|
+
if (includeSecrets && this.secrets) {
|
|
171
|
+
row = await this.decryptRowSecrets(row);
|
|
172
|
+
}
|
|
173
|
+
// Process joins
|
|
174
|
+
let processedRow = this.processJoinedRows([row], include)[0];
|
|
175
|
+
// Handle one-to-many joins with separate queries
|
|
176
|
+
if (this.joins && Object.keys(include).length > 0) {
|
|
177
|
+
processedRow = await this.fetchOneToManyJoins(processedRow, include, id);
|
|
178
|
+
}
|
|
179
|
+
// Validate row (but preserve join data)
|
|
180
|
+
const baseRow = this.rowSchema.parse(row);
|
|
181
|
+
const validatedRow = {
|
|
182
|
+
...baseRow,
|
|
183
|
+
...this.extractJoinData(processedRow, include),
|
|
184
|
+
};
|
|
185
|
+
ctx.result = validatedRow;
|
|
186
|
+
await this.runHooks('after', 'get', ctx);
|
|
187
|
+
return validatedRow;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
ctx.error = error;
|
|
191
|
+
await this.runHooks('error', 'get', ctx);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a new record
|
|
197
|
+
*/
|
|
198
|
+
async create(data, opts = { auth: {} }) {
|
|
199
|
+
const ctx = {
|
|
200
|
+
auth: opts.auth,
|
|
201
|
+
db: this.db,
|
|
202
|
+
deps: this.deps,
|
|
203
|
+
method: 'create',
|
|
204
|
+
params: opts,
|
|
205
|
+
data,
|
|
206
|
+
};
|
|
207
|
+
try {
|
|
208
|
+
await this.runHooks('before', 'create', ctx);
|
|
209
|
+
const { include = {}, includeSecrets = false } = opts;
|
|
210
|
+
// Validate input data
|
|
211
|
+
const validatedData = this.createSchema.parse(data);
|
|
212
|
+
// Add timestamp fields
|
|
213
|
+
const now = new Date().toISOString();
|
|
214
|
+
const dataWithTimestamps = {
|
|
215
|
+
...validatedData,
|
|
216
|
+
created_at: now,
|
|
217
|
+
updated_at: now,
|
|
218
|
+
};
|
|
219
|
+
// Encrypt secrets
|
|
220
|
+
let processedData = dataWithTimestamps;
|
|
221
|
+
if (this.secrets) {
|
|
222
|
+
processedData = await this.encryptDataSecrets(processedData);
|
|
223
|
+
}
|
|
224
|
+
// Build and execute insert
|
|
225
|
+
const { text: query, values: params } = buildInsert(this.table, processedData);
|
|
226
|
+
const stmt = this.db.prepare(query);
|
|
227
|
+
const result = await stmt.bind(...params).run();
|
|
228
|
+
if (!result.success) {
|
|
229
|
+
throw new DatabaseError('Failed to create record');
|
|
230
|
+
}
|
|
231
|
+
// Get the created record
|
|
232
|
+
const insertId = result.meta.last_row_id;
|
|
233
|
+
const createdRecord = await this.get(insertId, {
|
|
234
|
+
include,
|
|
235
|
+
includeSecrets,
|
|
236
|
+
auth: opts.auth,
|
|
237
|
+
});
|
|
238
|
+
if (!createdRecord) {
|
|
239
|
+
throw new DatabaseError('Failed to retrieve created record');
|
|
240
|
+
}
|
|
241
|
+
ctx.result = createdRecord;
|
|
242
|
+
await this.runHooks('after', 'create', ctx);
|
|
243
|
+
return createdRecord;
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
ctx.error = error;
|
|
247
|
+
await this.runHooks('error', 'create', ctx);
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Update a record by ID
|
|
253
|
+
*/
|
|
254
|
+
async update(id, data, opts = { auth: {} }) {
|
|
255
|
+
const ctx = {
|
|
256
|
+
auth: opts.auth,
|
|
257
|
+
db: this.db,
|
|
258
|
+
deps: this.deps,
|
|
259
|
+
method: 'update',
|
|
260
|
+
params: { id, ...opts },
|
|
261
|
+
data,
|
|
262
|
+
};
|
|
263
|
+
try {
|
|
264
|
+
await this.runHooks('before', 'update', ctx);
|
|
265
|
+
const { include = {}, includeSecrets = false } = opts;
|
|
266
|
+
// Check if record exists
|
|
267
|
+
const existingRecord = await this.get(id, { auth: opts.auth });
|
|
268
|
+
if (!existingRecord) {
|
|
269
|
+
throw new NotFoundError(this.table, id);
|
|
270
|
+
}
|
|
271
|
+
// Validate input data
|
|
272
|
+
const validatedData = this.updateSchema
|
|
273
|
+
.partial()
|
|
274
|
+
.parse(data);
|
|
275
|
+
// Add updated timestamp
|
|
276
|
+
const dataWithTimestamp = {
|
|
277
|
+
...validatedData,
|
|
278
|
+
updated_at: new Date().toISOString(),
|
|
279
|
+
};
|
|
280
|
+
// Encrypt secrets
|
|
281
|
+
let processedData = dataWithTimestamp;
|
|
282
|
+
if (this.secrets) {
|
|
283
|
+
processedData = await this.encryptDataSecrets(processedData);
|
|
284
|
+
}
|
|
285
|
+
// Build where clause for update
|
|
286
|
+
const where = {};
|
|
287
|
+
if (Array.isArray(this.primaryKey)) {
|
|
288
|
+
if (typeof id !== 'object') {
|
|
289
|
+
throw new ValidationError('Composite primary key requires an object');
|
|
290
|
+
}
|
|
291
|
+
Object.assign(where, id);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
where[this.primaryKey] = id;
|
|
295
|
+
}
|
|
296
|
+
// Build and execute update
|
|
297
|
+
const { text: query, values: params } = buildUpdate(this.table, processedData, where);
|
|
298
|
+
const stmt = this.db.prepare(query);
|
|
299
|
+
const result = await stmt.bind(...params).run();
|
|
300
|
+
if (!result.success) {
|
|
301
|
+
throw new DatabaseError('Failed to update record');
|
|
302
|
+
}
|
|
303
|
+
// Get the updated record
|
|
304
|
+
const updatedRecord = await this.get(id, {
|
|
305
|
+
include,
|
|
306
|
+
includeSecrets,
|
|
307
|
+
auth: opts.auth,
|
|
308
|
+
});
|
|
309
|
+
ctx.result = updatedRecord;
|
|
310
|
+
await this.runHooks('after', 'update', ctx);
|
|
311
|
+
return updatedRecord;
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
ctx.error = error;
|
|
315
|
+
await this.runHooks('error', 'update', ctx);
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Delete a record by ID
|
|
321
|
+
*/
|
|
322
|
+
async delete(id, opts = { auth: {} }) {
|
|
323
|
+
const ctx = {
|
|
324
|
+
auth: opts.auth,
|
|
325
|
+
db: this.db,
|
|
326
|
+
deps: this.deps,
|
|
327
|
+
method: 'delete',
|
|
328
|
+
params: { id, ...opts },
|
|
329
|
+
};
|
|
330
|
+
try {
|
|
331
|
+
await this.runHooks('before', 'delete', ctx);
|
|
332
|
+
// Check if record exists
|
|
333
|
+
const existingRecord = await this.get(id, { auth: opts.auth });
|
|
334
|
+
if (!existingRecord) {
|
|
335
|
+
throw new NotFoundError(this.table, id);
|
|
336
|
+
}
|
|
337
|
+
// Build where clause for delete
|
|
338
|
+
const where = {};
|
|
339
|
+
if (Array.isArray(this.primaryKey)) {
|
|
340
|
+
if (typeof id !== 'object') {
|
|
341
|
+
throw new ValidationError('Composite primary key requires an object');
|
|
342
|
+
}
|
|
343
|
+
Object.assign(where, id);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
where[this.primaryKey] = id;
|
|
347
|
+
}
|
|
348
|
+
// Build and execute delete
|
|
349
|
+
const { text: query, values: params } = buildDelete(this.table, where);
|
|
350
|
+
const stmt = this.db.prepare(query);
|
|
351
|
+
const result = await stmt.bind(...params).run();
|
|
352
|
+
if (!result.success) {
|
|
353
|
+
throw new DatabaseError('Failed to delete record');
|
|
354
|
+
}
|
|
355
|
+
const deleted = result.meta.changes > 0;
|
|
356
|
+
ctx.result = deleted;
|
|
357
|
+
await this.runHooks('after', 'delete', ctx);
|
|
358
|
+
return deleted;
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
ctx.error = error;
|
|
362
|
+
await this.runHooks('error', 'delete', ctx);
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Count records matching criteria
|
|
368
|
+
*/
|
|
369
|
+
async count(params = { auth: {} }) {
|
|
370
|
+
const ctx = {
|
|
371
|
+
auth: params.auth,
|
|
372
|
+
db: this.db,
|
|
373
|
+
deps: this.deps,
|
|
374
|
+
method: 'count',
|
|
375
|
+
params,
|
|
376
|
+
};
|
|
377
|
+
try {
|
|
378
|
+
await this.runHooks('before', 'count', ctx);
|
|
379
|
+
const { where = {} } = params;
|
|
380
|
+
// Build and execute count query
|
|
381
|
+
const { text: query, values: sqlParams } = buildCount(this.table, where);
|
|
382
|
+
const stmt = this.db.prepare(query);
|
|
383
|
+
const result = await stmt.bind(...sqlParams).first();
|
|
384
|
+
if (!result) {
|
|
385
|
+
throw new DatabaseError('Failed to execute count query');
|
|
386
|
+
}
|
|
387
|
+
const count = result.count;
|
|
388
|
+
ctx.result = count;
|
|
389
|
+
await this.runHooks('after', 'count', ctx);
|
|
390
|
+
return count;
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
ctx.error = error;
|
|
394
|
+
await this.runHooks('error', 'count', ctx);
|
|
395
|
+
throw error;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Execute custom SQL query
|
|
400
|
+
*/
|
|
401
|
+
async query(query, opts = { auth: {} }, ...sqlParams) {
|
|
402
|
+
const ctx = {
|
|
403
|
+
auth: opts.auth,
|
|
404
|
+
db: this.db,
|
|
405
|
+
deps: this.deps,
|
|
406
|
+
method: 'query',
|
|
407
|
+
params: opts,
|
|
408
|
+
};
|
|
409
|
+
try {
|
|
410
|
+
await this.runHooks('before', 'query', ctx);
|
|
411
|
+
const { includeSecrets = false } = opts;
|
|
412
|
+
// Execute the query
|
|
413
|
+
const stmt = this.db.prepare(query);
|
|
414
|
+
const result = sqlParams.length > 0
|
|
415
|
+
? await stmt.bind(...sqlParams).all()
|
|
416
|
+
: await stmt.all();
|
|
417
|
+
if (!result.success) {
|
|
418
|
+
throw new DatabaseError('Failed to execute custom query');
|
|
419
|
+
}
|
|
420
|
+
let rows = result.results || [];
|
|
421
|
+
// Decrypt secrets if requested
|
|
422
|
+
if (includeSecrets && this.secrets) {
|
|
423
|
+
rows = await Promise.all(rows.map((row) => this.decryptRowSecrets(row)));
|
|
424
|
+
}
|
|
425
|
+
ctx.result = rows;
|
|
426
|
+
await this.runHooks('after', 'query', ctx);
|
|
427
|
+
return rows;
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
ctx.error = error;
|
|
431
|
+
await this.runHooks('error', 'query', ctx);
|
|
432
|
+
throw error;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Run hooks with context for a specific method
|
|
437
|
+
*/
|
|
438
|
+
async runHooks(phase, method, ctx) {
|
|
439
|
+
const methodHooks = this.hooks[method];
|
|
440
|
+
if (!methodHooks)
|
|
441
|
+
return;
|
|
442
|
+
const hooks = methodHooks[phase];
|
|
443
|
+
if (!hooks)
|
|
444
|
+
return;
|
|
445
|
+
const hooksArray = Array.isArray(hooks) ? hooks : [hooks];
|
|
446
|
+
for (const hook of hooksArray) {
|
|
447
|
+
try {
|
|
448
|
+
await hook(ctx);
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
if (phase !== 'error') {
|
|
452
|
+
throw new HookError(phase, method, error);
|
|
453
|
+
}
|
|
454
|
+
// If an error hook throws, we just log it and continue
|
|
455
|
+
console.error(`Error in error hook for ${method}:`, error);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Get columns to select based on secrets configuration
|
|
461
|
+
*/
|
|
462
|
+
getSelectColumns(includeSecrets) {
|
|
463
|
+
// Return specific columns instead of wildcard to avoid SQL builder issues
|
|
464
|
+
const baseColumns = [
|
|
465
|
+
'id',
|
|
466
|
+
'name',
|
|
467
|
+
'email',
|
|
468
|
+
'tenant_id',
|
|
469
|
+
'created_at',
|
|
470
|
+
'updated_at',
|
|
471
|
+
];
|
|
472
|
+
if (!this.secrets || includeSecrets) {
|
|
473
|
+
// Include secret columns if requested
|
|
474
|
+
if (this.secrets) {
|
|
475
|
+
const secretColumns = this.secrets.map((secret) => secret.columnName);
|
|
476
|
+
return [...baseColumns, ...secretColumns];
|
|
477
|
+
}
|
|
478
|
+
return baseColumns;
|
|
479
|
+
}
|
|
480
|
+
// Exclude secret columns
|
|
481
|
+
return baseColumns;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Get allowed columns for ordering
|
|
485
|
+
*/
|
|
486
|
+
getAllowedColumns() {
|
|
487
|
+
// In practice, you'd want to be more restrictive
|
|
488
|
+
// For now, allow any column name that's a valid identifier
|
|
489
|
+
return ['id', 'created_at', 'updated_at', 'name', 'email']; // Example columns
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Encrypt secrets in data
|
|
493
|
+
*/
|
|
494
|
+
async encryptDataSecrets(data) {
|
|
495
|
+
if (!this.secrets)
|
|
496
|
+
return data;
|
|
497
|
+
return encryptSecrets(data, this.secrets, this.keyProvider);
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Decrypt secrets in a row
|
|
501
|
+
*/
|
|
502
|
+
async decryptRowSecrets(row) {
|
|
503
|
+
if (!this.secrets)
|
|
504
|
+
return row;
|
|
505
|
+
return decryptSecrets(row, this.secrets, this.keyProvider);
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Process joined rows by extracting join data
|
|
509
|
+
*/
|
|
510
|
+
processJoinedRows(rows, include) {
|
|
511
|
+
if (!this.joins || Object.keys(include).length === 0) {
|
|
512
|
+
return rows;
|
|
513
|
+
}
|
|
514
|
+
const joins = this.joins;
|
|
515
|
+
return rows.map((row) => {
|
|
516
|
+
const processedRow = { ...row };
|
|
517
|
+
for (const [joinName, joinDef] of Object.entries(joins)) {
|
|
518
|
+
if (!include[joinName])
|
|
519
|
+
continue;
|
|
520
|
+
const joinAlias = joinDef.remote.alias || joinName;
|
|
521
|
+
const joinData = {};
|
|
522
|
+
const keysToRemove = [];
|
|
523
|
+
// Extract join columns
|
|
524
|
+
for (const column of joinDef.remote.select) {
|
|
525
|
+
const aliasedKey = `${joinAlias}_${column}`;
|
|
526
|
+
if (aliasedKey in row) {
|
|
527
|
+
joinData[column] = row[aliasedKey];
|
|
528
|
+
keysToRemove.push(aliasedKey);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// Remove aliased keys from main row
|
|
532
|
+
for (const key of keysToRemove) {
|
|
533
|
+
delete processedRow[key];
|
|
534
|
+
}
|
|
535
|
+
// Add join data based on join kind
|
|
536
|
+
if (joinDef.kind === 'one') {
|
|
537
|
+
// For one-to-one, add as object or null
|
|
538
|
+
const hasData = Object.keys(joinData).length > 0 &&
|
|
539
|
+
Object.values(joinData).some((value) => value !== null && value !== undefined);
|
|
540
|
+
processedRow[joinName] = hasData ? joinData : null;
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
// For one-to-many, this will be overridden by fetchOneToManyJoins
|
|
544
|
+
// But set a default empty array for now
|
|
545
|
+
processedRow[joinName] = [];
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return processedRow;
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Extract only join data from processed row
|
|
553
|
+
*/
|
|
554
|
+
extractJoinData(processedRow, include) {
|
|
555
|
+
if (!this.joins)
|
|
556
|
+
return {};
|
|
557
|
+
const joinData = {};
|
|
558
|
+
for (const joinName of Object.keys(this.joins)) {
|
|
559
|
+
if (include[joinName] && joinName in processedRow) {
|
|
560
|
+
joinData[joinName] = processedRow[joinName];
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return joinData;
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Fetch one-to-many joins using separate queries
|
|
567
|
+
*/
|
|
568
|
+
async fetchOneToManyJoins(processedRow, include, mainRecordId) {
|
|
569
|
+
if (!this.joins)
|
|
570
|
+
return processedRow;
|
|
571
|
+
const result = { ...processedRow };
|
|
572
|
+
for (const [joinName, joinDef] of Object.entries(this.joins)) {
|
|
573
|
+
if (!include[joinName] || joinDef.kind !== 'many')
|
|
574
|
+
continue;
|
|
575
|
+
try {
|
|
576
|
+
let relatedRecords = [];
|
|
577
|
+
if (joinDef.through) {
|
|
578
|
+
// Many-to-many relationship through junction table
|
|
579
|
+
const sql = `
|
|
580
|
+
SELECT ${joinDef.remote.select.map((col) => `${joinDef.remote.table}.${col}`).join(', ')}
|
|
581
|
+
FROM ${joinDef.remote.table}
|
|
582
|
+
INNER JOIN ${joinDef.through.table} ON ${joinDef.remote.table}.${joinDef.remote.pk} = ${joinDef.through.table}.${joinDef.through.to}
|
|
583
|
+
WHERE ${joinDef.through.table}.${joinDef.through.from} = ?
|
|
584
|
+
`;
|
|
585
|
+
const stmt = this.db.prepare(sql);
|
|
586
|
+
const queryResult = await stmt.bind(mainRecordId).all();
|
|
587
|
+
if (queryResult.success) {
|
|
588
|
+
relatedRecords = queryResult.results;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
// Direct one-to-many relationship
|
|
593
|
+
const sql = `
|
|
594
|
+
SELECT ${joinDef.remote.select.map((col) => `${col}`).join(', ')}
|
|
595
|
+
FROM ${joinDef.remote.table}
|
|
596
|
+
WHERE ${joinDef.remote.pk} = ?
|
|
597
|
+
`;
|
|
598
|
+
const stmt = this.db.prepare(sql);
|
|
599
|
+
const queryResult = await stmt.bind(mainRecordId).all();
|
|
600
|
+
if (queryResult.success) {
|
|
601
|
+
relatedRecords = queryResult.results;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
// Set the join data
|
|
605
|
+
result[joinName] = relatedRecords || [];
|
|
606
|
+
}
|
|
607
|
+
catch (error) {
|
|
608
|
+
console.error(`Error fetching one-to-many join ${joinName}:`, error);
|
|
609
|
+
result[joinName] = [];
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return result;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|