@proteinjs/db 1.0.14 → 1.0.16
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/.eslintrc.js +20 -0
- package/.prettierignore +3 -0
- package/.prettierrc +8 -0
- package/CHANGELOG.md +14 -24
- package/LICENSE +21 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/src/Columns.d.ts.map +1 -1
- package/dist/src/Columns.js +34 -17
- package/dist/src/Columns.js.map +1 -1
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +45 -18
- package/dist/src/Db.js.map +1 -1
- package/dist/src/MigrationRunner.d.ts.map +1 -1
- package/dist/src/MigrationRunner.js +15 -7
- package/dist/src/MigrationRunner.js.map +1 -1
- package/dist/src/QueryBuilderFactory.d.ts.map +1 -1
- package/dist/src/QueryBuilderFactory.js +5 -7
- package/dist/src/QueryBuilderFactory.js.map +1 -1
- package/dist/src/Record.d.ts.map +1 -1
- package/dist/src/Record.js +4 -2
- package/dist/src/Record.js.map +1 -1
- package/dist/src/StatementConfigFactory.d.ts.map +1 -1
- package/dist/src/StatementConfigFactory.js +3 -2
- package/dist/src/StatementConfigFactory.js.map +1 -1
- package/dist/src/Table.d.ts.map +1 -1
- package/dist/src/Table.js +6 -3
- package/dist/src/Table.js.map +1 -1
- package/dist/src/auth/TableAuth.d.ts.map +1 -1
- package/dist/src/auth/TableAuth.js +16 -11
- package/dist/src/auth/TableAuth.js.map +1 -1
- package/dist/src/auth/TableServiceAuth.d.ts.map +1 -1
- package/dist/src/auth/TableServiceAuth.js +12 -6
- package/dist/src/auth/TableServiceAuth.js.map +1 -1
- package/dist/src/reference/Reference.d.ts.map +1 -1
- package/dist/src/reference/Reference.js.map +1 -1
- package/dist/src/reference/ReferenceArray.d.ts.map +1 -1
- package/dist/src/reference/ReferenceArray.js.map +1 -1
- package/dist/src/schema/SchemaMetadata.d.ts.map +1 -1
- package/dist/src/schema/SchemaMetadata.js +18 -15
- package/dist/src/schema/SchemaMetadata.js.map +1 -1
- package/dist/src/schema/SchemaOperations.d.ts.map +1 -1
- package/dist/src/schema/TableManager.d.ts.map +1 -1
- package/dist/src/schema/TableManager.js +24 -9
- package/dist/src/schema/TableManager.js.map +1 -1
- package/dist/src/serializers/GraphSerializer.d.ts.map +1 -1
- package/dist/src/serializers/QueryBuilderSerializer.d.ts.map +1 -1
- package/dist/src/serializers/ReferenceArraySerializer.d.ts.map +1 -1
- package/dist/src/serializers/ReferenceArraySerializer.js.map +1 -1
- package/dist/src/serializers/ReferenceSerializer.d.ts.map +1 -1
- package/dist/src/serializers/TableSerializer.d.ts.map +1 -1
- package/dist/src/services/DbService.d.ts.map +1 -1
- package/dist/src/source/SourceRecord.d.ts.map +1 -1
- package/dist/src/source/SourceRecord.js +7 -3
- package/dist/src/source/SourceRecord.js.map +1 -1
- package/dist/src/source/SourceRecordLoader.d.ts.map +1 -1
- package/dist/src/source/SourceRecordLoader.js +11 -4
- package/dist/src/source/SourceRecordLoader.js.map +1 -1
- package/dist/src/source/SourceRecordRepo.d.ts.map +1 -1
- package/dist/src/source/SourceRecordRepo.js.map +1 -1
- package/dist/src/tables/MigrationTable.d.ts.map +1 -1
- package/dist/src/tables/MigrationTable.js.map +1 -1
- package/dist/src/tables/tables.d.ts.map +1 -1
- package/dist/src/tables/tables.js.map +1 -1
- package/dist/test/CrudTests.d.ts +2 -0
- package/dist/test/CrudTests.d.ts.map +1 -1
- package/dist/test/CrudTests.js +19 -4
- package/dist/test/CrudTests.js.map +1 -1
- package/dist/test/TableManagerTests.d.ts.map +1 -1
- package/dist/test/TableManagerTests.js +17 -9
- package/dist/test/TableManagerTests.js.map +1 -1
- package/generated/index.ts +15 -18
- package/index.ts +1 -1
- package/jest.config.js +8 -17
- package/package.json +49 -43
- package/src/Columns.ts +284 -241
- package/src/Db.ts +188 -147
- package/src/MigrationRunner.ts +24 -10
- package/src/QueryBuilderFactory.ts +6 -9
- package/src/Record.ts +35 -29
- package/src/StatementConfigFactory.ts +14 -16
- package/src/Table.ts +91 -88
- package/src/auth/TableAuth.ts +37 -27
- package/src/auth/TableServiceAuth.ts +11 -9
- package/src/opt/moment.ts +1 -1
- package/src/reference/Reference.ts +7 -7
- package/src/reference/ReferenceArray.ts +8 -8
- package/src/schema/SchemaMetadata.ts +84 -64
- package/src/schema/SchemaOperations.ts +2 -2
- package/src/schema/TableManager.ts +178 -168
- package/src/serializers/GraphSerializer.ts +4 -4
- package/src/serializers/QueryBuilderSerializer.ts +11 -11
- package/src/serializers/ReferenceArraySerializer.ts +12 -8
- package/src/serializers/ReferenceSerializer.ts +7 -7
- package/src/serializers/TableSerializer.ts +5 -5
- package/src/services/DbService.ts +3 -3
- package/src/services/MigrationRunnerService.ts +1 -1
- package/src/source/SourceRecord.ts +43 -24
- package/src/source/SourceRecordLoader.ts +29 -18
- package/src/source/SourceRecordRepo.ts +3 -3
- package/src/tables/MigrationTable.ts +5 -5
- package/src/tables/tables.ts +1 -1
- package/test/CrudTests.ts +46 -26
- package/test/TableManagerTests.ts +329 -154
- package/tsconfig.json +18 -22
package/src/Columns.ts
CHANGED
|
@@ -8,283 +8,326 @@ import { Reference } from './reference/Reference';
|
|
|
8
8
|
import { QueryBuilderFactory } from './QueryBuilderFactory';
|
|
9
9
|
|
|
10
10
|
export class IntegerColumn implements Column<number, number> {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
constructor(
|
|
12
|
+
public name: string,
|
|
13
|
+
public options?: ColumnOptions,
|
|
14
|
+
public large = false
|
|
15
|
+
) {}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export class StringColumn<T = string> implements Column<T, string> {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
19
|
+
constructor(
|
|
20
|
+
public name: string,
|
|
21
|
+
public options?: ColumnOptions,
|
|
22
|
+
public maxLength: number | 'MAX' = 255
|
|
23
|
+
) {
|
|
24
|
+
this.options = Object.assign(
|
|
25
|
+
{
|
|
26
|
+
ui: {
|
|
27
|
+
hidden: maxLength === 'MAX',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
options
|
|
31
|
+
);
|
|
32
|
+
}
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
export class FloatColumn implements Column<number, number> {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
constructor(
|
|
37
|
+
public name: string,
|
|
38
|
+
public options?: ColumnOptions
|
|
39
|
+
) {}
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
export class DecimalColumn implements Column<number, number> {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
constructor(
|
|
44
|
+
public name: string,
|
|
45
|
+
public options?: ColumnOptions,
|
|
46
|
+
public large = false
|
|
47
|
+
) {}
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
export class BooleanColumn implements Column<boolean, boolean> {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
51
|
+
constructor(
|
|
52
|
+
public name: string,
|
|
53
|
+
public options?: ColumnOptions
|
|
54
|
+
) {}
|
|
55
|
+
|
|
56
|
+
async serialize(fieldValue: boolean | undefined): Promise<boolean> {
|
|
57
|
+
if (fieldValue) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async deserialize(serializedFieldValue: boolean): Promise<boolean> {
|
|
65
|
+
if (serializedFieldValue) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
export class DateColumn implements Column<Date, Date> {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
constructor(
|
|
75
|
+
public name: string,
|
|
76
|
+
public options?: ColumnOptions
|
|
77
|
+
) {}
|
|
73
78
|
}
|
|
74
79
|
|
|
75
80
|
export class DateTimeColumn implements Column<moment.Moment, Date> {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
81
|
+
constructor(
|
|
82
|
+
public name: string,
|
|
83
|
+
public options?: ColumnOptions
|
|
84
|
+
) {}
|
|
85
|
+
|
|
86
|
+
async serialize(fieldValue: moment.Moment | undefined): Promise<Date | undefined> {
|
|
87
|
+
if (typeof fieldValue === 'undefined') {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (typeof fieldValue.toDate === 'undefined') {
|
|
92
|
+
return moment(fieldValue).toDate();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return fieldValue.toDate();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async deserialize(serializedFieldValue: Date): Promise<moment.Moment> {
|
|
99
|
+
return moment(serializedFieldValue);
|
|
100
|
+
}
|
|
94
101
|
}
|
|
95
102
|
|
|
96
103
|
export class BinaryColumn implements Column<number, number> {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
constructor(
|
|
105
|
+
public name: string,
|
|
106
|
+
public options?: ColumnOptions,
|
|
107
|
+
public maxLength?: number | 'MAX'
|
|
108
|
+
) {
|
|
109
|
+
this.options = Object.assign(
|
|
110
|
+
{
|
|
111
|
+
ui: {
|
|
112
|
+
hidden: true,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
options
|
|
116
|
+
);
|
|
117
|
+
}
|
|
108
118
|
}
|
|
109
119
|
|
|
110
120
|
export class UuidColumn extends StringColumn {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
constructor(name: string, options?: ColumnOptions) {
|
|
122
|
+
super(
|
|
123
|
+
name,
|
|
124
|
+
Object.assign(
|
|
125
|
+
{
|
|
126
|
+
defaultValue: async () => uuidv1(),
|
|
127
|
+
ui: {
|
|
128
|
+
hidden: true,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
options
|
|
132
|
+
),
|
|
133
|
+
36
|
|
134
|
+
);
|
|
135
|
+
}
|
|
122
136
|
}
|
|
123
137
|
|
|
124
138
|
export class PasswordColumn extends StringColumn {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
) {
|
|
129
|
-
super(name, Object.assign({ ui: { hidden: true } }, options));
|
|
130
|
-
}
|
|
139
|
+
constructor(name: string, options?: ColumnOptions) {
|
|
140
|
+
super(name, Object.assign({ ui: { hidden: true } }, options));
|
|
141
|
+
}
|
|
131
142
|
}
|
|
132
143
|
|
|
133
144
|
export class ObjectColumn<T> extends StringColumn<T> {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
145
|
+
constructor(name: string, options?: ColumnOptions) {
|
|
146
|
+
super(
|
|
147
|
+
name,
|
|
148
|
+
Object.assign(
|
|
149
|
+
{
|
|
150
|
+
ui: {
|
|
151
|
+
hidden: true,
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
options
|
|
155
|
+
),
|
|
156
|
+
'MAX'
|
|
157
|
+
); // MAX is 4gb
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async serialize(fieldValue: T | undefined): Promise<string | undefined> {
|
|
161
|
+
if (typeof fieldValue === 'undefined' || fieldValue == null) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return JSON.stringify(fieldValue);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async deserialize(serializedFieldValue: string): Promise<T | undefined> {
|
|
169
|
+
if (typeof serializedFieldValue === 'undefined' || serializedFieldValue == null) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return JSON.parse(serializedFieldValue);
|
|
174
|
+
}
|
|
158
175
|
}
|
|
159
176
|
|
|
160
177
|
export class ArrayColumn<T> extends ObjectColumn<T[]> {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
178
|
+
constructor(name: string, options?: ColumnOptions) {
|
|
179
|
+
super(
|
|
180
|
+
name,
|
|
181
|
+
Object.assign(
|
|
182
|
+
{
|
|
183
|
+
ui: {
|
|
184
|
+
hidden: true,
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
options
|
|
188
|
+
)
|
|
189
|
+
);
|
|
190
|
+
}
|
|
171
191
|
}
|
|
172
192
|
|
|
173
193
|
export class ReferenceArrayColumn<T extends Record> extends ObjectColumn<ReferenceArray<T>> {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
194
|
+
/**
|
|
195
|
+
* A column that stores an array of references to other records.
|
|
196
|
+
*
|
|
197
|
+
* @param name name of column
|
|
198
|
+
* @param referenceTable name of table that the reference records are in
|
|
199
|
+
* @param cascadeDelete if true referenced records will be deleted when this record is deleted
|
|
200
|
+
* @param options generic column options
|
|
201
|
+
*/
|
|
202
|
+
constructor(
|
|
203
|
+
name: string,
|
|
204
|
+
public referenceTable: string,
|
|
205
|
+
public cascadeDelete: boolean,
|
|
206
|
+
options?: ColumnOptions
|
|
207
|
+
) {
|
|
208
|
+
super(
|
|
209
|
+
name,
|
|
210
|
+
Object.assign(
|
|
211
|
+
{
|
|
212
|
+
ui: {
|
|
213
|
+
hidden: true,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
options
|
|
217
|
+
)
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async serialize(fieldValue: ReferenceArray<T> | undefined): Promise<string | undefined> {
|
|
222
|
+
if (typeof fieldValue === 'undefined') {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const ids = (await fieldValue.get()).map((record) => record.id);
|
|
227
|
+
return await super.serialize(ids as any);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async deserialize(serializedFieldValue: string): Promise<ReferenceArray<T>> {
|
|
231
|
+
let ids = (await super.deserialize(serializedFieldValue)) as string[] | undefined;
|
|
232
|
+
if (typeof ids === 'undefined') {
|
|
233
|
+
ids = [];
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return new ReferenceArray(this.referenceTable, ids);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async beforeDelete(table: Table<any>, columnPropertyName: string, records: any[]) {
|
|
240
|
+
if (!this.cascadeDelete) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const recordIdsToDelete: string[] = [];
|
|
245
|
+
for (const record of records) {
|
|
246
|
+
const referenceArray = record[columnPropertyName] as ReferenceArray<Record>;
|
|
247
|
+
const referenceRecords = await referenceArray.get();
|
|
248
|
+
for (const referenceRecord of referenceRecords) {
|
|
249
|
+
recordIdsToDelete.push(referenceRecord.id);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (recordIdsToDelete.length < 1) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const referenceTable = tableByName(this.referenceTable);
|
|
258
|
+
const qb = new QueryBuilderFactory()
|
|
259
|
+
.getQueryBuilder(referenceTable)
|
|
260
|
+
.condition({ field: 'id', operator: 'IN', value: recordIdsToDelete });
|
|
261
|
+
await new Db().delete(referenceTable, qb);
|
|
262
|
+
}
|
|
232
263
|
}
|
|
233
264
|
|
|
234
265
|
export class ReferenceColumn<T extends Record> extends StringColumn<Reference<T>> {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
266
|
+
/**
|
|
267
|
+
* A column that stores a reference (id) to another record.
|
|
268
|
+
*
|
|
269
|
+
* @param name name of column
|
|
270
|
+
* @param referenceTable name of table that the reference record is in
|
|
271
|
+
* @param cascadeDelete if true referenced record will be deleted when this record is deleted
|
|
272
|
+
* @param options generic column options
|
|
273
|
+
*/
|
|
274
|
+
constructor(
|
|
275
|
+
name: string,
|
|
276
|
+
public referenceTable: string,
|
|
277
|
+
public cascadeDelete: boolean,
|
|
278
|
+
options?: ColumnOptions
|
|
279
|
+
) {
|
|
280
|
+
super(
|
|
281
|
+
name,
|
|
282
|
+
Object.assign(
|
|
283
|
+
{
|
|
284
|
+
ui: {
|
|
285
|
+
hidden: true,
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
options
|
|
289
|
+
),
|
|
290
|
+
36
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
async serialize(fieldValue: Reference<T> | undefined): Promise<string | undefined> {
|
|
295
|
+
if (typeof fieldValue === 'undefined') {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (!fieldValue._id) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return fieldValue._id;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async deserialize(serializedFieldValue: string): Promise<Reference<T>> {
|
|
307
|
+
return new Reference(this.referenceTable, serializedFieldValue);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
async beforeDelete(table: Table<any>, columnPropertyName: string, records: any[]) {
|
|
311
|
+
if (!this.cascadeDelete) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const recordIdsToDelete: string[] = [];
|
|
316
|
+
for (const record of records) {
|
|
317
|
+
const reference = record[columnPropertyName] as Reference<Record>;
|
|
318
|
+
if (reference && reference._id) {
|
|
319
|
+
recordIdsToDelete.push(reference._id);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (recordIdsToDelete.length < 1) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const referenceTable = tableByName(this.referenceTable);
|
|
328
|
+
const qb = new QueryBuilderFactory()
|
|
329
|
+
.getQueryBuilder(referenceTable)
|
|
330
|
+
.condition({ field: 'id', operator: 'IN', value: recordIdsToDelete });
|
|
331
|
+
await new Db().delete(referenceTable, qb);
|
|
332
|
+
}
|
|
333
|
+
}
|