vona-module-a-orm 5.1.4 → 5.1.6
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/cli/entity/metadata/generate.ts +13 -3
- package/cli/model/metadata/generate.ts +6 -3
- package/cli/model/metadata/magic.ts +6 -1
- package/dist/.metadata/locales.d.ts.map +1 -1
- package/dist/bean/aopMethod.transaction.d.ts.map +1 -1
- package/dist/bean/bean.database.d.ts.map +1 -1
- package/dist/bean/bean.databaseDialectBase.d.ts +3 -3
- package/dist/bean/bean.databaseDialectBase.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_cache.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_crud.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_crud_table.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_knex.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_meta.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_utils.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_utils.d.ts.map +1 -1
- package/dist/bean/bean.model/bean.model_view.d.ts.map +1 -1
- package/dist/bean/event.clientNameReal.d.ts.map +1 -1
- package/dist/bean/event.columnsClear.d.ts.map +1 -1
- package/dist/bean/queue.doubleDelete.d.ts.map +1 -1
- package/dist/bean/schedule.softDeletionPrune.d.ts.map +1 -1
- package/dist/common/buildWhere.d.ts.map +1 -1
- package/dist/common/utils.d.ts.map +1 -1
- package/dist/config/config.d.ts +3 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/extend/schemaBuilder.d.ts.map +1 -1
- package/dist/extend/tableBuilder.d.ts.map +1 -1
- package/dist/index.js +59 -28
- package/dist/index.js.map +1 -1
- package/dist/lib/const.d.ts.map +1 -1
- package/dist/lib/databaseDialect.d.ts.map +1 -1
- package/dist/lib/dto/dtoAggregate.d.ts.map +1 -1
- package/dist/lib/dto/dtoCreate.d.ts.map +1 -1
- package/dist/lib/dto/dtoGet.d.ts.map +1 -1
- package/dist/lib/dto/dtoGroup.d.ts.map +1 -1
- package/dist/lib/dto/dtoListAndCount.d.ts.map +1 -1
- package/dist/lib/dto/dtoMutate.d.ts.map +1 -1
- package/dist/lib/dto/dtoQueryPage.d.ts.map +1 -1
- package/dist/lib/dto/dtoSelectAndCount.d.ts.map +1 -1
- package/dist/lib/dto/dtoUpdate.d.ts.map +1 -1
- package/dist/lib/entity.d.ts.map +1 -1
- package/dist/lib/modelCacheBase.d.ts.map +1 -1
- package/dist/lib/relations.d.ts.map +1 -1
- package/dist/lib/relationsDynamic.d.ts.map +1 -1
- package/dist/lib/relationsMutate.d.ts.map +1 -1
- package/dist/lib/relationsStatic.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/service/columnsCache_.d.ts.map +1 -1
- package/dist/service/database.d.ts.map +1 -1
- package/dist/service/databaseClient_.d.ts.map +1 -1
- package/dist/service/relations_.d.ts.map +1 -1
- package/dist/service/transaction_.d.ts.map +1 -1
- package/dist/types/dto/dtoGet.d.ts.map +1 -1
- package/dist/types/dto/dtoGroup.d.ts.map +1 -1
- package/dist/types/dto/dtoMutate.d.ts.map +1 -1
- package/dist/types/dto/dtoQueryBase.d.ts.map +1 -1
- package/dist/types/dto/dtoSelectAndCount.d.ts.map +1 -1
- package/dist/types/entity.d.ts.map +1 -1
- package/dist/types/model.d.ts +5 -1
- package/dist/types/model.d.ts.map +1 -1
- package/dist/types/modelAggr.d.ts.map +1 -1
- package/dist/types/modelCount.d.ts.map +1 -1
- package/dist/types/modelGeneral.d.ts.map +1 -1
- package/dist/types/modelGroup.d.ts.map +1 -1
- package/dist/types/modelIncrement.d.ts.map +1 -1
- package/dist/types/modelWhere.d.ts.map +1 -1
- package/dist/types/onion/entity.d.ts +2 -2
- package/dist/types/onion/entity.d.ts.map +1 -1
- package/dist/types/onion/model.d.ts.map +1 -1
- package/dist/types/relations.d.ts.map +1 -1
- package/dist/types/relationsAggr.d.ts +1 -1
- package/dist/types/relationsAggr.d.ts.map +1 -1
- package/dist/types/relationsColumns.d.ts.map +1 -1
- package/dist/types/relationsDef.d.ts.map +1 -1
- package/dist/types/relationsDefDynamic.d.ts.map +1 -1
- package/dist/types/relationsDefMutate.d.ts.map +1 -1
- package/dist/types/relationsGroup.d.ts.map +1 -1
- package/dist/types/relationsMutate.d.ts.map +1 -1
- package/dist/types/relationsTables.d.ts.map +1 -1
- package/dist/types/transaction.d.ts.map +1 -1
- package/dist-cli/entity/metadata/generate.js +4 -1
- package/dist-cli/model/metadata/generate.js +4 -2
- package/package.json +1 -1
- package/src/.metadata/locales.ts +6 -1
- package/src/bean/aopMethod.transaction.ts +9 -2
- package/src/bean/bean.database.ts +33 -8
- package/src/bean/bean.databaseDialectBase.ts +50 -15
- package/src/bean/bean.model/bean.model_cache.ts +130 -46
- package/src/bean/bean.model/bean.model_crud.ts +28 -7
- package/src/bean/bean.model/bean.model_crud_inner.ts +48 -16
- package/src/bean/bean.model/bean.model_crud_table.ts +25 -5
- package/src/bean/bean.model/bean.model_knex.ts +18 -5
- package/src/bean/bean.model/bean.model_meta.ts +23 -5
- package/src/bean/bean.model/bean.model_utils.ts +63 -12
- package/src/bean/bean.model/bean.model_view.ts +20 -5
- package/src/bean/event.clientNameReal.ts +4 -1
- package/src/bean/event.columnsClear.ts +4 -1
- package/src/bean/queue.doubleDelete.ts +9 -2
- package/src/bean/schedule.softDeletionPrune.ts +3 -1
- package/src/common/buildWhere.ts +30 -5
- package/src/common/utils.ts +6 -2
- package/src/config/config.ts +3 -0
- package/src/extend/schemaBuilder.ts +2 -1
- package/src/extend/tableBuilder.ts +32 -19
- package/src/lib/const.ts +3 -1
- package/src/lib/databaseDialect.ts +3 -1
- package/src/lib/dto/dtoAggregate.ts +18 -6
- package/src/lib/dto/dtoCreate.ts +24 -4
- package/src/lib/dto/dtoGet.ts +82 -17
- package/src/lib/dto/dtoGroup.ts +24 -8
- package/src/lib/dto/dtoListAndCount.ts +3 -1
- package/src/lib/dto/dtoMutate.ts +26 -7
- package/src/lib/dto/dtoQueryPage.ts +4 -1
- package/src/lib/dto/dtoSelectAndCount.ts +3 -1
- package/src/lib/dto/dtoUpdate.ts +24 -4
- package/src/lib/entity.ts +10 -4
- package/src/lib/modelCacheBase.ts +9 -3
- package/src/lib/relations.ts +22 -4
- package/src/lib/relationsDynamic.ts +29 -7
- package/src/lib/relationsMutate.ts +28 -5
- package/src/lib/relationsStatic.ts +4 -1
- package/src/lib/utils.ts +11 -2
- package/src/main.ts +10 -2
- package/src/service/columnsCache_.ts +8 -6
- package/src/service/database.ts +34 -10
- package/src/service/databaseClient_.ts +4 -1
- package/src/service/relations_.ts +98 -23
- package/src/service/transaction_.ts +14 -4
- package/src/types/dto/dtoGet.ts +14 -6
- package/src/types/dto/dtoGroup.ts +2 -1
- package/src/types/dto/dtoMutate.ts +102 -20
- package/src/types/dto/dtoQueryBase.ts +5 -1
- package/src/types/dto/dtoSelectAndCount.ts +4 -1
- package/src/types/entity.ts +3 -1
- package/src/types/entityBase.ts +1 -1
- package/src/types/entityBaseInner.ts +4 -4
- package/src/types/entityBaseSimple.ts +1 -1
- package/src/types/model.ts +73 -16
- package/src/types/modelAggr.ts +18 -6
- package/src/types/modelCount.ts +4 -1
- package/src/types/modelGeneral.ts +26 -5
- package/src/types/modelGroup.ts +8 -2
- package/src/types/modelIncrement.ts +4 -1
- package/src/types/modelWhere.ts +12 -3
- package/src/types/onion/entity.ts +2 -2
- package/src/types/onion/model.ts +20 -4
- package/src/types/relations.ts +151 -47
- package/src/types/relationsAggr.ts +35 -11
- package/src/types/relationsColumns.ts +80 -57
- package/src/types/relationsDef.ts +82 -29
- package/src/types/relationsDefDynamic.ts +59 -13
- package/src/types/relationsDefMutate.ts +3 -1
- package/src/types/relationsGroup.ts +32 -10
- package/src/types/relationsMutate.ts +60 -19
- package/src/types/relationsTables.ts +16 -14
- package/src/types/transaction.ts +14 -2
|
@@ -31,7 +31,10 @@ export class BeanModelMeta<TRecord extends {} = {}> extends BeanBase {
|
|
|
31
31
|
private [SymbolModelDb]?: ServiceDb;
|
|
32
32
|
private [SymbolModelTable]?: TypeModelOptionsTable;
|
|
33
33
|
|
|
34
|
-
protected __init__(
|
|
34
|
+
protected __init__(
|
|
35
|
+
clientName?: keyof IDatabaseClientRecord | ServiceDb,
|
|
36
|
+
table?: TypeModelOptionsTable,
|
|
37
|
+
) {
|
|
35
38
|
// clientName
|
|
36
39
|
if (!isNil(clientName)) {
|
|
37
40
|
if (typeof clientName === 'string') {
|
|
@@ -115,7 +118,12 @@ export class BeanModelMeta<TRecord extends {} = {}> extends BeanBase {
|
|
|
115
118
|
return this.options.disableUpdateTime ?? this.scopeOrm.config.model.disableUpdateTime;
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
protected _prepareDisableInstanceByOptions(
|
|
121
|
+
protected _prepareDisableInstanceByOptions(
|
|
122
|
+
table: keyof ITableRecord,
|
|
123
|
+
data: any,
|
|
124
|
+
options?: IModelMethodOptionsGeneral,
|
|
125
|
+
useRaw?: boolean,
|
|
126
|
+
) {
|
|
119
127
|
const columnNameInstance = useRaw ? 'iid' : `${getTableOrTableAlias(table)}.iid`;
|
|
120
128
|
if (this._checkDisableInstanceByOptions(options)) {
|
|
121
129
|
delete data.iid;
|
|
@@ -130,7 +138,12 @@ export class BeanModelMeta<TRecord extends {} = {}> extends BeanBase {
|
|
|
130
138
|
return data;
|
|
131
139
|
}
|
|
132
140
|
|
|
133
|
-
protected _prepareDisableDeletedByOptions(
|
|
141
|
+
protected _prepareDisableDeletedByOptions(
|
|
142
|
+
table: keyof ITableRecord,
|
|
143
|
+
data: any,
|
|
144
|
+
options?: IModelMethodOptionsGeneral,
|
|
145
|
+
useRaw?: boolean,
|
|
146
|
+
) {
|
|
134
147
|
const columnNameDeleted = useRaw ? 'deleted' : `${getTableOrTableAlias(table)}.deleted`;
|
|
135
148
|
const deleted = this._prepareDisableDeletedByOptionsSimple(options);
|
|
136
149
|
if (!isNil(deleted)) {
|
|
@@ -140,7 +153,9 @@ export class BeanModelMeta<TRecord extends {} = {}> extends BeanBase {
|
|
|
140
153
|
return data;
|
|
141
154
|
}
|
|
142
155
|
|
|
143
|
-
protected _prepareDisableDeletedByOptionsSimple(
|
|
156
|
+
protected _prepareDisableDeletedByOptionsSimple(
|
|
157
|
+
options?: IModelMethodOptionsGeneral,
|
|
158
|
+
): boolean | undefined {
|
|
144
159
|
if (!isNil(options?.deleted)) {
|
|
145
160
|
if (!this.disableDeleted) {
|
|
146
161
|
return options?.deleted;
|
|
@@ -177,7 +192,10 @@ export class BeanModelMeta<TRecord extends {} = {}> extends BeanBase {
|
|
|
177
192
|
return options?.disableUpdateTime ?? this.disableUpdateTime;
|
|
178
193
|
}
|
|
179
194
|
|
|
180
|
-
public newInstance(
|
|
195
|
+
public newInstance(
|
|
196
|
+
client?: keyof IDatabaseClientRecord | ServiceDb,
|
|
197
|
+
table?: TypeModelOptionsTable,
|
|
198
|
+
): this {
|
|
181
199
|
return this.app.bean._newBean(this.$beanFullName as any, client ?? this.db, table);
|
|
182
200
|
}
|
|
183
201
|
|
|
@@ -25,7 +25,10 @@ import { BeanModelMeta } from './bean.model_meta.ts';
|
|
|
25
25
|
|
|
26
26
|
export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
27
27
|
async prepareData(item?: Partial<TRecord>): Promise<[TRecord, TRecord]>;
|
|
28
|
-
async prepareData(
|
|
28
|
+
async prepareData(
|
|
29
|
+
table: keyof ITableRecord,
|
|
30
|
+
item?: Partial<TRecord>,
|
|
31
|
+
): Promise<[TRecord, TRecord]>;
|
|
29
32
|
async prepareData(table?, item?): Promise<[TRecord, TRecord]> {
|
|
30
33
|
if (typeof table !== 'string') {
|
|
31
34
|
item = table;
|
|
@@ -73,8 +76,14 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
raw(value: Knex.Value): Knex.Raw<any>;
|
|
76
|
-
raw<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(
|
|
77
|
-
|
|
79
|
+
raw<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(
|
|
80
|
+
sql: string,
|
|
81
|
+
binding: Knex.RawBinding,
|
|
82
|
+
): Knex.Raw<TResult2>;
|
|
83
|
+
raw<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(
|
|
84
|
+
sql: string,
|
|
85
|
+
bindings: readonly Knex.RawBinding[] | Knex.ValueDict,
|
|
86
|
+
): Knex.Raw<TResult2>;
|
|
78
87
|
raw(sql, bindings?) {
|
|
79
88
|
return this.connection.raw(sql, bindings);
|
|
80
89
|
}
|
|
@@ -114,7 +123,10 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
114
123
|
}
|
|
115
124
|
}
|
|
116
125
|
|
|
117
|
-
buildDistinct(
|
|
126
|
+
buildDistinct(
|
|
127
|
+
builder: Knex.QueryBuilder,
|
|
128
|
+
distinct?: boolean | keyof TRecord | (keyof TRecord)[],
|
|
129
|
+
) {
|
|
118
130
|
if (distinct === undefined || distinct === false) return;
|
|
119
131
|
if (distinct === true) {
|
|
120
132
|
builder.distinct();
|
|
@@ -125,7 +137,11 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
125
137
|
}
|
|
126
138
|
}
|
|
127
139
|
|
|
128
|
-
buildCount(
|
|
140
|
+
buildCount(
|
|
141
|
+
builder: Knex.QueryBuilder,
|
|
142
|
+
column?: TypeModelColumn<TRecord>,
|
|
143
|
+
distinct?: boolean | keyof TRecord | (keyof TRecord)[],
|
|
144
|
+
) {
|
|
129
145
|
if (column !== undefined) {
|
|
130
146
|
builder.count(column);
|
|
131
147
|
} else if (distinct !== undefined && distinct !== false) {
|
|
@@ -158,7 +174,11 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
158
174
|
}
|
|
159
175
|
}
|
|
160
176
|
|
|
161
|
-
buildColumns(
|
|
177
|
+
buildColumns(
|
|
178
|
+
builder: Knex.QueryBuilder,
|
|
179
|
+
columns?: TypeModelColumns<TRecord>,
|
|
180
|
+
groups?: (keyof TRecord)[] | undefined,
|
|
181
|
+
) {
|
|
162
182
|
if (columns) {
|
|
163
183
|
builder.select(columns as any);
|
|
164
184
|
} else if (groups) {
|
|
@@ -191,16 +211,27 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
191
211
|
this.buildOffset(builder, page.index);
|
|
192
212
|
}
|
|
193
213
|
|
|
194
|
-
prepareHaving(
|
|
214
|
+
prepareHaving(
|
|
215
|
+
builder: Knex.QueryBuilder,
|
|
216
|
+
having?: TypeModelWhere<TRecord, TypeModelSelectGroupParamsColumns<TRecord>>,
|
|
217
|
+
) {
|
|
195
218
|
if (!having) return;
|
|
196
219
|
this.buildHaving(builder, having);
|
|
197
220
|
}
|
|
198
221
|
|
|
199
|
-
buildHaving(
|
|
222
|
+
buildHaving(
|
|
223
|
+
builder: Knex.QueryBuilder,
|
|
224
|
+
having: TypeModelWhere<TRecord, TypeModelSelectGroupParamsColumns<TRecord>>,
|
|
225
|
+
) {
|
|
200
226
|
return buildWhere(this.db, builder, having, true);
|
|
201
227
|
}
|
|
202
228
|
|
|
203
|
-
prepareWhere(
|
|
229
|
+
prepareWhere(
|
|
230
|
+
builder: Knex.QueryBuilder,
|
|
231
|
+
table?: keyof ITableRecord,
|
|
232
|
+
where?: TypeModelWhere<TRecord>,
|
|
233
|
+
options?: IModelMethodOptionsGeneral,
|
|
234
|
+
) {
|
|
204
235
|
// table
|
|
205
236
|
table = table || this.getTable(where);
|
|
206
237
|
if (!table) throw new Error('should specify the table name');
|
|
@@ -225,7 +256,11 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
225
256
|
return String(value);
|
|
226
257
|
}
|
|
227
258
|
|
|
228
|
-
extractFirstValue(
|
|
259
|
+
extractFirstValue(
|
|
260
|
+
result: Array<object> | object,
|
|
261
|
+
defaultValue?: any,
|
|
262
|
+
columnName?: string,
|
|
263
|
+
): any | undefined {
|
|
229
264
|
const value = this._extractFirstValue(result, columnName);
|
|
230
265
|
if (value === undefined || value === null) return defaultValue;
|
|
231
266
|
return value;
|
|
@@ -240,7 +275,11 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
240
275
|
return res[keys[0]];
|
|
241
276
|
}
|
|
242
277
|
|
|
243
|
-
protected _prepareWhereByOptions(
|
|
278
|
+
protected _prepareWhereByOptions(
|
|
279
|
+
table: keyof ITableRecord,
|
|
280
|
+
where,
|
|
281
|
+
options?: IModelMethodOptionsGeneral,
|
|
282
|
+
) {
|
|
244
283
|
// disableInstance: should not check if specified
|
|
245
284
|
where = this._prepareDisableInstanceByOptions(table, where, options);
|
|
246
285
|
// disableDeleted: should not check if specified
|
|
@@ -249,7 +288,11 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
249
288
|
return where;
|
|
250
289
|
}
|
|
251
290
|
|
|
252
|
-
protected _prepareInsertDataByOptions(
|
|
291
|
+
protected _prepareInsertDataByOptions(
|
|
292
|
+
table: keyof ITableRecord,
|
|
293
|
+
data,
|
|
294
|
+
options?: IModelMethodOptionsGeneral,
|
|
295
|
+
) {
|
|
253
296
|
let result = Object.assign({}, data);
|
|
254
297
|
// disableInstance: should not check if specified
|
|
255
298
|
result = this._prepareDisableInstanceByOptions(table, result, options, true);
|
|
@@ -272,4 +315,12 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
|
272
315
|
}
|
|
273
316
|
return result;
|
|
274
317
|
}
|
|
318
|
+
|
|
319
|
+
protected _ellipsisLogger(str: string) {
|
|
320
|
+
const maxLength = this.scopeOrm.config.logger.maxLength;
|
|
321
|
+
if (str.length > maxLength) {
|
|
322
|
+
str = str.substring(0, maxLength) + ' ...';
|
|
323
|
+
}
|
|
324
|
+
return str;
|
|
325
|
+
}
|
|
275
326
|
}
|
|
@@ -7,7 +7,10 @@ import { cast } from 'vona';
|
|
|
7
7
|
import { BeanModelKnex } from './bean.model_knex.ts';
|
|
8
8
|
|
|
9
9
|
export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
10
|
-
async createView(
|
|
10
|
+
async createView(
|
|
11
|
+
viewName: string,
|
|
12
|
+
callback?: (viewBuilder: Knex.ViewBuilder) => any,
|
|
13
|
+
): Promise<void> {
|
|
11
14
|
if (callback) {
|
|
12
15
|
// create view
|
|
13
16
|
let _view: Knex.ViewBuilder | null = null;
|
|
@@ -42,7 +45,10 @@ export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
async alterView(
|
|
48
|
+
async alterView(
|
|
49
|
+
viewName: string,
|
|
50
|
+
callback?: (viewBuilder: Knex.ViewBuilder) => any,
|
|
51
|
+
): Promise<void> {
|
|
46
52
|
await this._viewDependentsAll_handle(viewName, async () => {
|
|
47
53
|
// drop view
|
|
48
54
|
await this.dropView(viewName, true);
|
|
@@ -51,7 +57,10 @@ export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
|
51
57
|
});
|
|
52
58
|
}
|
|
53
59
|
|
|
54
|
-
async createTable(
|
|
60
|
+
async createTable(
|
|
61
|
+
tableName: string,
|
|
62
|
+
callback: (tableBuilder: Knex.CreateTableBuilder) => any,
|
|
63
|
+
): Promise<void> {
|
|
55
64
|
await this.schema.createTable(tableName, callback);
|
|
56
65
|
}
|
|
57
66
|
|
|
@@ -59,7 +68,11 @@ export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
|
59
68
|
await this.schema.dropTable(tableName);
|
|
60
69
|
}
|
|
61
70
|
|
|
62
|
-
async alterTable(
|
|
71
|
+
async alterTable(
|
|
72
|
+
tableName: string,
|
|
73
|
+
callback: (tableBuilder: Knex.CreateTableBuilder) => any,
|
|
74
|
+
alterViewAuto?: boolean,
|
|
75
|
+
): Promise<void> {
|
|
63
76
|
if (!alterViewAuto) {
|
|
64
77
|
// alter table
|
|
65
78
|
return await this.schema.alterTable(tableName, table => {
|
|
@@ -99,7 +112,9 @@ export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
|
99
112
|
// dependencies
|
|
100
113
|
const view = views.find(view => view.name === dependent);
|
|
101
114
|
if (view) {
|
|
102
|
-
const dep = cast(view.dependencies).find(
|
|
115
|
+
const dep = cast(view.dependencies).find(
|
|
116
|
+
dep => dep.toLowerCase() === viewName.toLowerCase(),
|
|
117
|
+
);
|
|
103
118
|
if (!dep) {
|
|
104
119
|
cast(view.dependencies).push(viewName);
|
|
105
120
|
}
|
|
@@ -7,4 +7,7 @@ export type TypeEventClientNameRealData = keyof IDatabaseClientRecord;
|
|
|
7
7
|
export type TypeEventClientNameRealResult = keyof IDatabaseClientRecord;
|
|
8
8
|
|
|
9
9
|
@Event()
|
|
10
|
-
export class EventClientNameReal extends BeanEventBase<
|
|
10
|
+
export class EventClientNameReal extends BeanEventBase<
|
|
11
|
+
TypeEventClientNameRealData,
|
|
12
|
+
TypeEventClientNameRealResult
|
|
13
|
+
> {}
|
|
@@ -10,4 +10,7 @@ export interface TypeEventColumnsClearData {
|
|
|
10
10
|
export type TypeEventColumnsClearResult = void;
|
|
11
11
|
|
|
12
12
|
@Event()
|
|
13
|
-
export class EventColumnsClear extends BeanEventBase<
|
|
13
|
+
export class EventColumnsClear extends BeanEventBase<
|
|
14
|
+
TypeEventColumnsClearData,
|
|
15
|
+
TypeEventColumnsClearResult
|
|
16
|
+
> {}
|
|
@@ -22,8 +22,15 @@ export class QueueDoubleDelete
|
|
|
22
22
|
extends BeanQueueBase<TypeQueueDoubleDeleteJobData, TypeQueueDoubleDeleteJobResult>
|
|
23
23
|
implements IQueueExecute<TypeQueueDoubleDeleteJobData, TypeQueueDoubleDeleteJobResult>
|
|
24
24
|
{
|
|
25
|
-
async execute(
|
|
26
|
-
|
|
25
|
+
async execute(
|
|
26
|
+
data: TypeQueueDoubleDeleteJobData,
|
|
27
|
+
_options?: IQueuePushOptions,
|
|
28
|
+
): Promise<TypeQueueDoubleDeleteJobResult> {
|
|
29
|
+
const beanInstance = this.app.bean._newBean(
|
|
30
|
+
data.beanFullName as any,
|
|
31
|
+
data.clientName,
|
|
32
|
+
data.table,
|
|
33
|
+
);
|
|
27
34
|
await beanInstance[data.method](...data.args);
|
|
28
35
|
}
|
|
29
36
|
}
|
|
@@ -13,7 +13,9 @@ export class ScheduleSoftDeletionPrune extends BeanBase implements IScheduleExec
|
|
|
13
13
|
const onionSlices = this.bean.onion.model.getOnionsEnabledCached();
|
|
14
14
|
for (const onionSlice of onionSlices) {
|
|
15
15
|
if (onionSlice.beanOptions.options?.disableDeleted) continue;
|
|
16
|
-
let softDeletionPrune =
|
|
16
|
+
let softDeletionPrune =
|
|
17
|
+
onionSlice.beanOptions.options?.softDeletionPrune ??
|
|
18
|
+
this.scope.config.softDeletionPrune.enable;
|
|
17
19
|
if (!softDeletionPrune) continue;
|
|
18
20
|
if (softDeletionPrune === true) softDeletionPrune = {};
|
|
19
21
|
await this._modulePrune(onionSlice, softDeletionPrune);
|
package/src/common/buildWhere.ts
CHANGED
|
@@ -4,12 +4,23 @@ import { isNil } from '@cabloy/utils';
|
|
|
4
4
|
import { cast } from 'vona';
|
|
5
5
|
|
|
6
6
|
import type { ServiceDb } from '../service/db_.ts';
|
|
7
|
-
import type {
|
|
7
|
+
import type {
|
|
8
|
+
TypeModelColumnValue,
|
|
9
|
+
TypeModelWhere,
|
|
10
|
+
TypeModelWhereFieldAll,
|
|
11
|
+
TypeOpsJoint,
|
|
12
|
+
TypeOpsNormal,
|
|
13
|
+
} from '../types/modelWhere.ts';
|
|
8
14
|
|
|
9
15
|
import { Op, OpAggrs, OpJointValues, OpNormalValues } from '../types/modelWhere.ts';
|
|
10
16
|
import { isRaw, isRef } from './utils.ts';
|
|
11
17
|
|
|
12
|
-
export function buildWhere<TRecord>(
|
|
18
|
+
export function buildWhere<TRecord>(
|
|
19
|
+
db: ServiceDb,
|
|
20
|
+
builder: Knex.QueryBuilder,
|
|
21
|
+
wheres: TypeModelWhere<TRecord>,
|
|
22
|
+
having: boolean = false,
|
|
23
|
+
) {
|
|
13
24
|
_buildWhereInner(having, db, builder, wheres);
|
|
14
25
|
}
|
|
15
26
|
|
|
@@ -111,7 +122,9 @@ function _buildWhereColumn<TRecord>(
|
|
|
111
122
|
db: ServiceDb,
|
|
112
123
|
builder: Knex.QueryBuilder,
|
|
113
124
|
column: keyof TRecord,
|
|
114
|
-
value:
|
|
125
|
+
value:
|
|
126
|
+
| TypeModelColumnValue<TRecord, TRecord[keyof TRecord]>
|
|
127
|
+
| TypeModelWhereFieldAll<TRecord, TRecord[keyof TRecord]>,
|
|
115
128
|
op?: TypeOpsNormal,
|
|
116
129
|
) {
|
|
117
130
|
// skip
|
|
@@ -206,11 +219,23 @@ function _buildWhereColumnOpNormal<TRecord>(
|
|
|
206
219
|
}
|
|
207
220
|
|
|
208
221
|
function _getOpLikeReal(having: boolean, db: ServiceDb) {
|
|
209
|
-
return db.dialect.capabilities.like
|
|
222
|
+
return db.dialect.capabilities.like
|
|
223
|
+
? having
|
|
224
|
+
? 'havingLike'
|
|
225
|
+
: 'whereLike'
|
|
226
|
+
: having
|
|
227
|
+
? 'havingILike'
|
|
228
|
+
: 'whereILike';
|
|
210
229
|
}
|
|
211
230
|
|
|
212
231
|
function _getOpILikeReal(having: boolean, db: ServiceDb) {
|
|
213
|
-
return db.dialect.capabilities.ilike
|
|
232
|
+
return db.dialect.capabilities.ilike
|
|
233
|
+
? having
|
|
234
|
+
? 'havingILike'
|
|
235
|
+
: 'whereILike'
|
|
236
|
+
: having
|
|
237
|
+
? 'havingLike'
|
|
238
|
+
: 'whereLike';
|
|
214
239
|
}
|
|
215
240
|
|
|
216
241
|
function _checkHavingColumn<TRecord>(db: ServiceDb, column: keyof TRecord | string) {
|
package/src/common/utils.ts
CHANGED
|
@@ -26,7 +26,9 @@ export function getTargetColumnName(column: string) {
|
|
|
26
26
|
return column;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
export function prepareColumns<TRecord>(
|
|
29
|
+
export function prepareColumns<TRecord>(
|
|
30
|
+
columns?: TypeModelColumns<TRecord>,
|
|
31
|
+
): Array<TypeModelColumn<TRecord>> | undefined {
|
|
30
32
|
if (!columns) return undefined;
|
|
31
33
|
columns = Array.isArray(columns) ? columns : [columns];
|
|
32
34
|
if (columns.includes('*')) return undefined;
|
|
@@ -34,7 +36,9 @@ export function prepareColumns<TRecord>(columns?: TypeModelColumns<TRecord>): Ar
|
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
export function prepareClassModel<ModelLike extends BeanModelMeta | keyof IModelClassRecord>(
|
|
37
|
-
classType: ModelLike extends BeanModelMeta
|
|
39
|
+
classType: ModelLike extends BeanModelMeta
|
|
40
|
+
? (() => Constructable<ModelLike>) | Constructable<ModelLike>
|
|
41
|
+
: ModelLike,
|
|
38
42
|
): Constructable<ModelLike> {
|
|
39
43
|
if (typeof classType === 'string') {
|
|
40
44
|
const beanOptions = appResource.getBean(beanFullNameFromOnionName(classType, 'model'));
|
package/src/config/config.ts
CHANGED
|
@@ -10,7 +10,8 @@ import type { IFetchDatabasesResultItem, IFetchIndexesResultItem } from '../type
|
|
|
10
10
|
export function ExtendSchemaBuilder(app: VonaApplication) {
|
|
11
11
|
['fetchDatabases', 'createDatabase', 'dropDatabase', 'fetchIndexes'].forEach(method => {
|
|
12
12
|
knex.SchemaBuilder.extend(method, async function (...args) {
|
|
13
|
-
const client = cast<Knex.Client>(cast(this).client).config
|
|
13
|
+
const client = cast<Knex.Client>(cast(this).client).config
|
|
14
|
+
.client as keyof IDatabaseClientDialectRecord;
|
|
14
15
|
const dialect = app.bean.database.getDialect(client);
|
|
15
16
|
return await dialect[method](this, ...args);
|
|
16
17
|
});
|
|
@@ -14,7 +14,11 @@ export interface IBasicFieldsOptions {
|
|
|
14
14
|
|
|
15
15
|
export function ExtendTableBuilder(app: VonaApplication) {
|
|
16
16
|
const scope = app.scope(__ThisModule__);
|
|
17
|
-
function _basicFields(
|
|
17
|
+
function _basicFields(
|
|
18
|
+
this: knex.Knex.TableBuilder,
|
|
19
|
+
options?: IBasicFieldsOptions,
|
|
20
|
+
identityType?: TableIdentityType,
|
|
21
|
+
) {
|
|
18
22
|
options = options || ({} as IBasicFieldsOptions);
|
|
19
23
|
if (options.id !== false) {
|
|
20
24
|
const _identityType = identityType ?? scope.config.table.identityType;
|
|
@@ -32,24 +36,33 @@ export function ExtendTableBuilder(app: VonaApplication) {
|
|
|
32
36
|
return this;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
knex.TableBuilder.extend(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return this
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
39
|
+
knex.TableBuilder.extend(
|
|
40
|
+
'basicFields',
|
|
41
|
+
function (this: knex.Knex.TableBuilder, options?: IBasicFieldsOptions) {
|
|
42
|
+
_basicFields.call(this, options, undefined);
|
|
43
|
+
return this;
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
knex.TableBuilder.extend(
|
|
47
|
+
'basicFieldsSimple',
|
|
48
|
+
function (this: knex.Knex.TableBuilder, options?: IBasicFieldsOptions) {
|
|
49
|
+
_basicFields.call(this, options, 'number');
|
|
50
|
+
return this;
|
|
51
|
+
},
|
|
52
|
+
);
|
|
53
|
+
knex.TableBuilder.extend(
|
|
54
|
+
'tableIdentity',
|
|
55
|
+
function (this: knex.Knex.TableBuilder, columnName: string) {
|
|
56
|
+
const _identityType = scope.config.table.identityType;
|
|
57
|
+
if (_identityType === 'bigint') {
|
|
58
|
+
return this.bigInteger(columnName); // default value is null
|
|
59
|
+
} else if (_identityType === 'number') {
|
|
60
|
+
return this.integer(columnName); // default value is null
|
|
61
|
+
} else {
|
|
62
|
+
throw new Error(`Should create column ${columnName} by yourself`);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
);
|
|
53
66
|
knex.TableBuilder.extend('userId', function (this: knex.Knex.TableBuilder, columnName?: string) {
|
|
54
67
|
return this.tableIdentity(columnName ?? 'userId');
|
|
55
68
|
});
|
package/src/lib/const.ts
CHANGED
|
@@ -25,7 +25,9 @@ export function getCacheModelCacheInstances(app: VonaApplication) {
|
|
|
25
25
|
return app.meta[SymbolCacheModelCacheInstances];
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export function getCacheModelsClear(
|
|
28
|
+
export function getCacheModelsClear(
|
|
29
|
+
app: VonaApplication,
|
|
30
|
+
): Record<keyof IModelRecord, TypeModelClassLikeGeneral[]> {
|
|
29
31
|
if (!app.meta[SymbolCacheModelsClear]) {
|
|
30
32
|
app.meta[SymbolCacheModelsClear] = _collectModelsClear(app);
|
|
31
33
|
}
|
|
@@ -2,6 +2,8 @@ import { createBeanDecorator } from 'vona';
|
|
|
2
2
|
|
|
3
3
|
import type { IDecoratorDatabaseDialectOptions } from '../types/index.ts';
|
|
4
4
|
|
|
5
|
-
export function DatabaseDialect<T extends IDecoratorDatabaseDialectOptions>(
|
|
5
|
+
export function DatabaseDialect<T extends IDecoratorDatabaseDialectOptions>(
|
|
6
|
+
options?: T,
|
|
7
|
+
): ClassDecorator {
|
|
6
8
|
return createBeanDecorator('databaseDialect', options);
|
|
7
9
|
}
|
|
@@ -11,20 +11,28 @@ import type { IModelClassRecord } from '../../types/onion/model.ts';
|
|
|
11
11
|
import type { TypeModelOfModelLike, TypeSymbolKeyEntity } from '../../types/relations.ts';
|
|
12
12
|
|
|
13
13
|
export function DtoAggregate<
|
|
14
|
-
Aggrs extends TypeModelSelectAggrParamsAggrs<
|
|
14
|
+
Aggrs extends TypeModelSelectAggrParamsAggrs<
|
|
15
|
+
TypeModelOfModelLike<ModelLike>[TypeSymbolKeyEntity]
|
|
16
|
+
>,
|
|
15
17
|
ModelLike extends BeanModelMeta | keyof IModelClassRecord,
|
|
16
18
|
>(
|
|
17
|
-
modelLike: ModelLike extends BeanModelMeta
|
|
19
|
+
modelLike: ModelLike extends BeanModelMeta
|
|
20
|
+
? (() => Constructable<ModelLike>) | Constructable<ModelLike>
|
|
21
|
+
: ModelLike,
|
|
18
22
|
aggrs: Aggrs,
|
|
19
23
|
): Constructable<TypeDtoAggrResult<Aggrs>> {
|
|
20
24
|
return _DtoAggregate_raw(modelLike, aggrs);
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
function _DtoAggregate_raw<
|
|
24
|
-
Aggrs extends TypeModelSelectAggrParamsAggrs<
|
|
28
|
+
Aggrs extends TypeModelSelectAggrParamsAggrs<
|
|
29
|
+
TypeModelOfModelLike<ModelLike>[TypeSymbolKeyEntity]
|
|
30
|
+
>,
|
|
25
31
|
ModelLike extends BeanModelMeta | keyof IModelClassRecord,
|
|
26
32
|
>(
|
|
27
|
-
modelLike: ModelLike extends BeanModelMeta
|
|
33
|
+
modelLike: ModelLike extends BeanModelMeta
|
|
34
|
+
? (() => Constructable<ModelLike>) | Constructable<ModelLike>
|
|
35
|
+
: ModelLike,
|
|
28
36
|
aggrs: Aggrs,
|
|
29
37
|
): Constructable<TypeDtoAggrResult<Aggrs>> {
|
|
30
38
|
abstract class TargetClass {}
|
|
@@ -32,11 +40,15 @@ function _DtoAggregate_raw<
|
|
|
32
40
|
}
|
|
33
41
|
|
|
34
42
|
export function _DtoAggregate_inner<
|
|
35
|
-
Aggrs extends TypeModelSelectAggrParamsAggrs<
|
|
43
|
+
Aggrs extends TypeModelSelectAggrParamsAggrs<
|
|
44
|
+
TypeModelOfModelLike<ModelLike>[TypeSymbolKeyEntity]
|
|
45
|
+
>,
|
|
36
46
|
ModelLike extends BeanModelMeta | keyof IModelClassRecord,
|
|
37
47
|
>(
|
|
38
48
|
classTarget: Constructable,
|
|
39
|
-
_modelLike: ModelLike extends BeanModelMeta
|
|
49
|
+
_modelLike: ModelLike extends BeanModelMeta
|
|
50
|
+
? (() => Constructable<ModelLike>) | Constructable<ModelLike>
|
|
51
|
+
: ModelLike,
|
|
40
52
|
aggrs: Aggrs,
|
|
41
53
|
): Constructable<TypeDtoAggrResult<Aggrs>> {
|
|
42
54
|
for (const key in aggrs) {
|
package/src/lib/dto/dtoCreate.ts
CHANGED
|
@@ -6,9 +6,29 @@ import type { IModelClassRecord } from '../../types/onion/model.ts';
|
|
|
6
6
|
|
|
7
7
|
import { _DtoMutate_raw } from './dtoMutate.ts';
|
|
8
8
|
|
|
9
|
-
export function DtoCreate<
|
|
10
|
-
|
|
9
|
+
export function DtoCreate<
|
|
10
|
+
ModelLike extends BeanModelMeta | keyof IModelClassRecord,
|
|
11
|
+
T extends IDtoMutateParams<ModelLike> | undefined = undefined,
|
|
12
|
+
>(
|
|
13
|
+
modelLike: ModelLike extends BeanModelMeta
|
|
14
|
+
? (() => Constructable<ModelLike>) | Constructable<ModelLike>
|
|
15
|
+
: ModelLike,
|
|
11
16
|
params?: T,
|
|
12
|
-
): Constructable<
|
|
13
|
-
|
|
17
|
+
): Constructable<
|
|
18
|
+
TypeDtoMutateResult<
|
|
19
|
+
ModelLike,
|
|
20
|
+
T,
|
|
21
|
+
'create',
|
|
22
|
+
'id' | 'iid' | 'deleted' | 'createdAt' | 'updatedAt',
|
|
23
|
+
true
|
|
24
|
+
>
|
|
25
|
+
> {
|
|
26
|
+
return _DtoMutate_raw(
|
|
27
|
+
modelLike,
|
|
28
|
+
params,
|
|
29
|
+
'create',
|
|
30
|
+
['id', 'iid', 'deleted', 'createdAt', 'updatedAt'] as any,
|
|
31
|
+
true,
|
|
32
|
+
undefined,
|
|
33
|
+
);
|
|
14
34
|
}
|