vona-module-a-orm 5.0.95 → 5.1.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/LICENSE +0 -0
- package/cli/entity/metadata/generate.ts +2 -1
- package/cli/model/metadata/generate.ts +6 -2
- package/cli/model/metadata/magic.ts +15 -6
- package/dist/.metadata/index.d.ts +1 -0
- package/dist/.metadata/index.d.ts.map +1 -0
- package/dist/.metadata/locales.d.ts +2 -1
- package/dist/.metadata/locales.d.ts.map +1 -0
- package/dist/.metadata/this.d.ts +1 -0
- package/dist/.metadata/this.d.ts.map +1 -0
- package/dist/bean/aopMethod.transaction.d.ts +2 -1
- package/dist/bean/aopMethod.transaction.d.ts.map +1 -0
- package/dist/bean/bean.database.d.ts +2 -1
- package/dist/bean/bean.database.d.ts.map +1 -0
- package/dist/bean/bean.databaseDialectBase.d.ts +2 -1
- package/dist/bean/bean.databaseDialectBase.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_cache.d.ts +5 -1
- package/dist/bean/bean.model/bean.model_cache.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_crud.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts +3 -1
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud_table.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_crud_table.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_knex.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_knex.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_meta.d.ts +3 -2
- package/dist/bean/bean.model/bean.model_meta.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_utils.d.ts +5 -3
- package/dist/bean/bean.model/bean.model_utils.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_view.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_view.d.ts.map +1 -0
- package/dist/bean/bean.model.d.ts +1 -0
- package/dist/bean/bean.model.d.ts.map +1 -0
- package/dist/bean/bean.modelBase.d.ts +1 -0
- package/dist/bean/bean.modelBase.d.ts.map +1 -0
- package/dist/bean/broadcast.columnsClear.d.ts +2 -1
- package/dist/bean/broadcast.columnsClear.d.ts.map +1 -0
- package/dist/bean/event.clientNameReal.d.ts +2 -1
- package/dist/bean/event.clientNameReal.d.ts.map +1 -0
- package/dist/bean/event.columnsClear.d.ts +2 -1
- package/dist/bean/event.columnsClear.d.ts.map +1 -0
- package/dist/bean/hmr.entity.d.ts +1 -0
- package/dist/bean/hmr.entity.d.ts.map +1 -0
- package/dist/bean/hmr.model.d.ts +1 -0
- package/dist/bean/hmr.model.d.ts.map +1 -0
- package/dist/bean/queue.doubleDelete.d.ts +2 -1
- package/dist/bean/queue.doubleDelete.d.ts.map +1 -0
- package/dist/bean/schedule.softDeletionPrune.d.ts +1 -0
- package/dist/bean/schedule.softDeletionPrune.d.ts.map +1 -0
- package/dist/common/buildWhere.d.ts +1 -0
- package/dist/common/buildWhere.d.ts.map +1 -0
- package/dist/common/checkWhere.d.ts +1 -0
- package/dist/common/checkWhere.d.ts.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/utils.d.ts +2 -1
- package/dist/common/utils.d.ts.map +1 -0
- package/dist/config/config.d.ts +1 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/errors.d.ts +1 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/locale/en-us.d.ts +1 -0
- package/dist/config/locale/en-us.d.ts.map +1 -0
- package/dist/config/locale/zh-cn.d.ts +1 -0
- package/dist/config/locale/zh-cn.d.ts.map +1 -0
- package/dist/extend/index.d.ts +1 -0
- package/dist/extend/index.d.ts.map +1 -0
- package/dist/extend/schemaBuilder.d.ts +1 -0
- package/dist/extend/schemaBuilder.d.ts.map +1 -0
- package/dist/extend/tableBuilder.d.ts +1 -0
- package/dist/extend/tableBuilder.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -51
- package/dist/index.js.map +1 -0
- package/dist/lib/const.d.ts +1 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/databaseDialect.d.ts +1 -0
- package/dist/lib/databaseDialect.d.ts.map +1 -0
- package/dist/lib/dto/dto.d.ts +3 -0
- package/dist/lib/dto/dto.d.ts.map +1 -0
- package/dist/lib/dto/dtoAggregate.d.ts +3 -2
- package/dist/lib/dto/dtoAggregate.d.ts.map +1 -0
- package/dist/lib/dto/dtoCreate.d.ts +2 -1
- package/dist/lib/dto/dtoCreate.d.ts.map +1 -0
- package/dist/lib/dto/dtoGet.d.ts +2 -1
- package/dist/lib/dto/dtoGet.d.ts.map +1 -0
- package/dist/lib/dto/dtoGroup.d.ts +2 -1
- package/dist/lib/dto/dtoGroup.d.ts.map +1 -0
- package/dist/lib/dto/dtoListAndCount.d.ts +4 -0
- package/dist/lib/dto/dtoListAndCount.d.ts.map +1 -0
- package/dist/lib/dto/dtoMutate.d.ts +3 -2
- package/dist/lib/dto/dtoMutate.d.ts.map +1 -0
- package/dist/lib/dto/dtoQuery.d.ts +1 -0
- package/dist/lib/dto/dtoQuery.d.ts.map +1 -0
- package/dist/lib/dto/dtoQueryPage.d.ts +1 -0
- package/dist/lib/dto/dtoQueryPage.d.ts.map +1 -0
- package/dist/lib/dto/dtoSelectAndCount.d.ts +2 -1
- package/dist/lib/dto/dtoSelectAndCount.d.ts.map +1 -0
- package/dist/lib/dto/dtoUpdate.d.ts +2 -1
- package/dist/lib/dto/dtoUpdate.d.ts.map +1 -0
- package/dist/lib/dto/index.d.ts +1 -0
- package/dist/lib/dto/index.d.ts.map +1 -0
- package/dist/lib/entity.d.ts +1 -0
- package/dist/lib/entity.d.ts.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/model.d.ts +1 -0
- package/dist/lib/model.d.ts.map +1 -0
- package/dist/lib/modelCacheBase.d.ts +2 -1
- package/dist/lib/modelCacheBase.d.ts.map +1 -0
- package/dist/lib/relations.d.ts +5 -4
- package/dist/lib/relations.d.ts.map +1 -0
- package/dist/lib/relationsDynamic.d.ts +5 -4
- package/dist/lib/relationsDynamic.d.ts.map +1 -0
- package/dist/lib/relationsMutate.d.ts +4 -3
- package/dist/lib/relationsMutate.d.ts.map +1 -0
- package/dist/lib/relationsStatic.d.ts +1 -0
- package/dist/lib/relationsStatic.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/main.d.ts +2 -1
- package/dist/main.d.ts.map +1 -0
- package/dist/service/cacheEntity_.d.ts +1 -0
- package/dist/service/cacheEntity_.d.ts.map +1 -0
- package/dist/service/cacheQuery_.d.ts +1 -0
- package/dist/service/cacheQuery_.d.ts.map +1 -0
- package/dist/service/columnsCache_.d.ts +2 -1
- package/dist/service/columnsCache_.d.ts.map +1 -0
- package/dist/service/columns_.d.ts +2 -1
- package/dist/service/columns_.d.ts.map +1 -0
- package/dist/service/database.d.ts +2 -1
- package/dist/service/database.d.ts.map +1 -0
- package/dist/service/databaseAsyncLocalStorage_.d.ts +1 -0
- package/dist/service/databaseAsyncLocalStorage_.d.ts.map +1 -0
- package/dist/service/databaseClient_.d.ts +2 -1
- package/dist/service/databaseClient_.d.ts.map +1 -0
- package/dist/service/db_.d.ts +2 -1
- package/dist/service/db_.d.ts.map +1 -0
- package/dist/service/entityResolver_.d.ts +1 -0
- package/dist/service/entityResolver_.d.ts.map +1 -0
- package/dist/service/modelResolver_.d.ts +1 -0
- package/dist/service/modelResolver_.d.ts.map +1 -0
- package/dist/service/relations_.d.ts +2 -1
- package/dist/service/relations_.d.ts.map +1 -0
- package/dist/service/transactionAsyncLocalStorage_.d.ts +1 -0
- package/dist/service/transactionAsyncLocalStorage_.d.ts.map +1 -0
- package/dist/service/transactionConsistency/342/200/214_.d.ts +1 -0
- package/dist/service/transactionConsistency/342/200/214_.d.ts.map +1 -0
- package/dist/service/transactionFiber_.d.ts +1 -0
- package/dist/service/transactionFiber_.d.ts.map +1 -0
- package/dist/service/transactionState_.d.ts +2 -1
- package/dist/service/transactionState_.d.ts.map +1 -0
- package/dist/service/transaction_.d.ts +2 -1
- package/dist/service/transaction_.d.ts.map +1 -0
- package/dist/types/columns.d.ts +1 -0
- package/dist/types/columns.d.ts.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/database.d.ts +1 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/depth.d.ts +1 -0
- package/dist/types/depth.d.ts.map +1 -0
- package/dist/types/dialect.d.ts +1 -0
- package/dist/types/dialect.d.ts.map +1 -0
- package/dist/types/dto/dtoAggregate.d.ts +1 -0
- package/dist/types/dto/dtoAggregate.d.ts.map +1 -0
- package/dist/types/dto/dtoGet.d.ts +3 -2
- package/dist/types/dto/dtoGet.d.ts.map +1 -0
- package/dist/types/dto/dtoGroup.d.ts +1 -0
- package/dist/types/dto/dtoGroup.d.ts.map +1 -0
- package/dist/types/dto/dtoListAndCount.d.ts +8 -0
- package/dist/types/dto/dtoListAndCount.d.ts.map +1 -0
- package/dist/types/dto/dtoMutate.d.ts +8 -9
- package/dist/types/dto/dtoMutate.d.ts.map +1 -0
- package/dist/types/dto/dtoQueryBase.d.ts +1 -0
- package/dist/types/dto/dtoQueryBase.d.ts.map +1 -0
- package/dist/types/dto/dtoQueryPageBase.d.ts +1 -0
- package/dist/types/dto/dtoQueryPageBase.d.ts.map +1 -0
- package/dist/types/dto/dtoSelectAndCount.d.ts +2 -1
- package/dist/types/dto/dtoSelectAndCount.d.ts.map +1 -0
- package/dist/types/dto/index.d.ts +2 -0
- package/dist/types/dto/index.d.ts.map +1 -0
- package/dist/types/entity.d.ts +1 -0
- package/dist/types/entity.d.ts.map +1 -0
- package/dist/types/entityBase.d.ts +1 -0
- package/dist/types/entityBase.d.ts.map +1 -0
- package/dist/types/entityBaseEmpty.d.ts +1 -0
- package/dist/types/entityBaseEmpty.d.ts.map +1 -0
- package/dist/types/entityBaseInner.d.ts +1 -0
- package/dist/types/entityBaseInner.d.ts.map +1 -0
- package/dist/types/entityBaseSimple.d.ts +1 -0
- package/dist/types/entityBaseSimple.d.ts.map +1 -0
- package/dist/types/extra.d.ts +1 -0
- package/dist/types/extra.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.d.ts +1 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/model.d.ts +3 -2
- package/dist/types/model.d.ts.map +1 -0
- package/dist/types/modelAggr.d.ts +2 -1
- package/dist/types/modelAggr.d.ts.map +1 -0
- package/dist/types/modelCount.d.ts +2 -1
- package/dist/types/modelCount.d.ts.map +1 -0
- package/dist/types/modelGeneral.d.ts +4 -3
- package/dist/types/modelGeneral.d.ts.map +1 -0
- package/dist/types/modelGroup.d.ts +2 -1
- package/dist/types/modelGroup.d.ts.map +1 -0
- package/dist/types/modelIncrement.d.ts +19 -0
- package/dist/types/modelIncrement.d.ts.map +1 -0
- package/dist/types/modelWhere.d.ts +2 -1
- package/dist/types/modelWhere.d.ts.map +1 -0
- package/dist/types/onion/databaseDialect.d.ts +1 -0
- package/dist/types/onion/databaseDialect.d.ts.map +1 -0
- package/dist/types/onion/entity.d.ts +1 -0
- package/dist/types/onion/entity.d.ts.map +1 -0
- package/dist/types/onion/index.d.ts +1 -0
- package/dist/types/onion/index.d.ts.map +1 -0
- package/dist/types/onion/model.d.ts +1 -0
- package/dist/types/onion/model.d.ts.map +1 -0
- package/dist/types/onion/table.d.ts +1 -0
- package/dist/types/onion/table.d.ts.map +1 -0
- package/dist/types/relations.d.ts +10 -11
- package/dist/types/relations.d.ts.map +1 -0
- package/dist/types/relationsAggr.d.ts +2 -1
- package/dist/types/relationsAggr.d.ts.map +1 -0
- package/dist/types/relationsColumns.d.ts +5 -4
- package/dist/types/relationsColumns.d.ts.map +1 -0
- package/dist/types/relationsDef.d.ts +5 -4
- package/dist/types/relationsDef.d.ts.map +1 -0
- package/dist/types/relationsDefDynamic.d.ts +6 -5
- package/dist/types/relationsDefDynamic.d.ts.map +1 -0
- package/dist/types/relationsDefMutate.d.ts +1 -0
- package/dist/types/relationsDefMutate.d.ts.map +1 -0
- package/dist/types/relationsGroup.d.ts +1 -0
- package/dist/types/relationsGroup.d.ts.map +1 -0
- package/dist/types/relationsMutate.d.ts +4 -3
- package/dist/types/relationsMutate.d.ts.map +1 -0
- package/dist/types/relationsTables.d.ts +1 -0
- package/dist/types/relationsTables.d.ts.map +1 -0
- package/dist/types/transaction.d.ts +1 -0
- package/dist/types/transaction.d.ts.map +1 -0
- package/dist-cli/entity/metadata/generate.js +1 -1
- package/dist-cli/model/metadata/generate.js +4 -2
- package/dist-cli/model/metadata/magic.js +2 -2
- package/package.json +40 -36
- package/src/.metadata/index.ts +348 -0
- package/src/.metadata/locales.ts +13 -0
- package/src/.metadata/this.ts +2 -0
- package/src/bean/aopMethod.transaction.ts +18 -0
- package/src/bean/bean.database.ts +57 -0
- package/src/bean/bean.databaseDialectBase.ts +149 -0
- package/src/bean/bean.model/bean.model_cache.ts +815 -0
- package/src/bean/bean.model/bean.model_crud.ts +46 -0
- package/src/bean/bean.model/bean.model_crud_inner.ts +281 -0
- package/src/bean/bean.model/bean.model_crud_table.ts +59 -0
- package/src/bean/bean.model/bean.model_knex.ts +60 -0
- package/src/bean/bean.model/bean.model_meta.ts +204 -0
- package/src/bean/bean.model/bean.model_utils.ts +275 -0
- package/src/bean/bean.model/bean.model_view.ts +129 -0
- package/src/bean/bean.model.ts +8 -0
- package/src/bean/bean.modelBase.ts +8 -0
- package/src/bean/broadcast.columnsClear.ts +24 -0
- package/src/bean/event.clientNameReal.ts +10 -0
- package/src/bean/event.columnsClear.ts +13 -0
- package/src/bean/hmr.entity.ts +12 -0
- package/src/bean/hmr.model.ts +16 -0
- package/src/bean/queue.doubleDelete.ts +29 -0
- package/src/bean/schedule.softDeletionPrune.ts +45 -0
- package/src/common/buildWhere.ts +238 -0
- package/src/common/checkWhere.ts +128 -0
- package/src/common/index.ts +3 -0
- package/src/common/utils.ts +74 -0
- package/src/config/config.ts +60 -0
- package/src/config/errors.ts +3 -0
- package/src/config/locale/en-us.ts +8 -0
- package/src/config/locale/zh-cn.ts +8 -0
- package/src/extend/index.ts +12 -0
- package/src/extend/schemaBuilder.ts +29 -0
- package/src/extend/tableBuilder.ts +87 -0
- package/src/index.ts +10 -0
- package/src/lib/const.ts +58 -0
- package/src/lib/databaseDialect.ts +7 -0
- package/src/lib/dto/dto.ts +21 -0
- package/src/lib/dto/dtoAggregate.ts +51 -0
- package/src/lib/dto/dtoCreate.ts +14 -0
- package/src/lib/dto/dtoGet.ts +159 -0
- package/src/lib/dto/dtoGroup.ts +57 -0
- package/src/lib/dto/dtoListAndCount.ts +16 -0
- package/src/lib/dto/dtoMutate.ts +82 -0
- package/src/lib/dto/dtoQuery.ts +9 -0
- package/src/lib/dto/dtoQueryPage.ts +9 -0
- package/src/lib/dto/dtoSelectAndCount.ts +20 -0
- package/src/lib/dto/dtoUpdate.ts +16 -0
- package/src/lib/dto/index.ts +1 -0
- package/src/lib/entity.ts +25 -0
- package/src/lib/index.ts +9 -0
- package/src/lib/model.ts +7 -0
- package/src/lib/modelCacheBase.ts +98 -0
- package/src/lib/relations.ts +118 -0
- package/src/lib/relationsDynamic.ts +75 -0
- package/src/lib/relationsMutate.ts +60 -0
- package/src/lib/relationsStatic.ts +18 -0
- package/src/lib/utils.ts +45 -0
- package/src/main.ts +79 -0
- package/src/service/cacheEntity_.ts +37 -0
- package/src/service/cacheQuery_.ts +20 -0
- package/src/service/columnsCache_.ts +69 -0
- package/src/service/columns_.ts +64 -0
- package/src/service/database.ts +126 -0
- package/src/service/databaseAsyncLocalStorage_.ts +29 -0
- package/src/service/databaseClient_.ts +124 -0
- package/src/service/db_.ts +77 -0
- package/src/service/entityResolver_.ts +25 -0
- package/src/service/modelResolver_.ts +19 -0
- package/src/service/relations_.ts +444 -0
- package/src/service/transactionAsyncLocalStorage_.ts +31 -0
- package/src/service/transactionConsistency/342/200/214_.ts +37 -0
- package/src/service/transactionFiber_.ts +42 -0
- package/src/service/transactionState_.ts +35 -0
- package/src/service/transaction_.ts +147 -0
- package/src/types/columns.ts +8 -0
- package/src/types/config.ts +23 -0
- package/src/types/database.ts +64 -0
- package/src/types/depth.ts +55 -0
- package/src/types/dialect.ts +17 -0
- package/src/types/dto/dtoAggregate.ts +3 -0
- package/src/types/dto/dtoGet.ts +23 -0
- package/src/types/dto/dtoGroup.ts +3 -0
- package/src/types/dto/dtoListAndCount.ts +7 -0
- package/src/types/dto/dtoMutate.ts +231 -0
- package/src/types/dto/dtoQueryBase.ts +18 -0
- package/src/types/dto/dtoQueryPageBase.ts +18 -0
- package/src/types/dto/dtoSelectAndCount.ts +11 -0
- package/src/types/dto/index.ts +8 -0
- package/src/types/entity.ts +15 -0
- package/src/types/entityBase.ts +11 -0
- package/src/types/entityBaseEmpty.ts +1 -0
- package/src/types/entityBaseInner.ts +18 -0
- package/src/types/entityBaseSimple.ts +9 -0
- package/src/types/extra.ts +23 -0
- package/src/types/index.ts +30 -0
- package/src/types/logger.ts +6 -0
- package/src/types/model.ts +152 -0
- package/src/types/modelAggr.ts +69 -0
- package/src/types/modelCount.ts +40 -0
- package/src/types/modelGeneral.ts +61 -0
- package/src/types/modelGroup.ts +48 -0
- package/src/types/modelIncrement.ts +50 -0
- package/src/types/modelWhere.ts +85 -0
- package/src/types/onion/databaseDialect.ts +22 -0
- package/src/types/onion/entity.ts +33 -0
- package/src/types/onion/index.ts +4 -0
- package/src/types/onion/model.ts +68 -0
- package/src/types/onion/table.ts +1 -0
- package/src/types/relations.ts +243 -0
- package/src/types/relationsAggr.ts +31 -0
- package/src/types/relationsColumns.ts +116 -0
- package/src/types/relationsDef.ts +152 -0
- package/src/types/relationsDefDynamic.ts +128 -0
- package/src/types/relationsDefMutate.ts +11 -0
- package/src/types/relationsGroup.ts +58 -0
- package/src/types/relationsMutate.ts +118 -0
- package/src/types/relationsTables.ts +38 -0
- package/src/types/transaction.ts +23 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { TableIdentity } from 'table-identity';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
IModelCountParams,
|
|
5
|
+
IModelGetOptionsGeneral,
|
|
6
|
+
IModelMethodOptionsGeneral,
|
|
7
|
+
IModelSelectParams,
|
|
8
|
+
IModelUpdateOptionsGeneral,
|
|
9
|
+
TypeModelWhere,
|
|
10
|
+
} from '../../types/index.ts';
|
|
11
|
+
|
|
12
|
+
import { BeanModelCrudInner } from './bean.model_crud_inner.ts';
|
|
13
|
+
|
|
14
|
+
export class BeanModelCrud<TRecord extends {} = {}> extends BeanModelCrudInner<TRecord> {
|
|
15
|
+
async mget(ids: TableIdentity[], options?: IModelGetOptionsGeneral<TRecord>): Promise<Partial<TRecord>[]> {
|
|
16
|
+
return await this._mget(undefined, ids, options);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async select(params?: IModelSelectParams<TRecord>, options?: IModelMethodOptionsGeneral): Promise<Partial<TRecord>[]> {
|
|
20
|
+
return await this._select(undefined, params, options);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async get(where: TypeModelWhere<TRecord>, options?: IModelGetOptionsGeneral<TRecord>): Promise<Partial<TRecord> | undefined> {
|
|
24
|
+
return await this._get(undefined, where, options);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async count(params?: IModelCountParams<TRecord>, options?: IModelMethodOptionsGeneral): Promise<string | undefined> {
|
|
28
|
+
return await this._count(undefined, params, options);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async insert(data?: Partial<TRecord>, options?: IModelMethodOptionsGeneral): Promise<TRecord> {
|
|
32
|
+
return (await this._insertBulk(undefined, data, options)) as Promise<TRecord>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async insertBulk(data: Partial<TRecord>[], options?: IModelMethodOptionsGeneral): Promise<TRecord[]> {
|
|
36
|
+
return (await this._insertBulk(undefined, data, options)) as Promise<TRecord[]>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async update(data: Partial<TRecord>, options?: IModelUpdateOptionsGeneral<TRecord>): Promise<Partial<TRecord>> {
|
|
40
|
+
return await this._update(undefined, data, options);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async delete(where?: TypeModelWhere<TRecord>, options?: IModelMethodOptionsGeneral): Promise<void> {
|
|
44
|
+
return await this._delete(undefined, where, options);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
import type { TableIdentity } from 'table-identity';
|
|
3
|
+
|
|
4
|
+
import { isNil } from '@cabloy/utils';
|
|
5
|
+
import { cast } from 'vona';
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
IModelCountParams,
|
|
9
|
+
IModelGetOptionsGeneral,
|
|
10
|
+
IModelIncrementParams,
|
|
11
|
+
IModelMethodOptionsGeneral,
|
|
12
|
+
IModelSelectGeneralParams,
|
|
13
|
+
IModelSelectParams,
|
|
14
|
+
IModelUpdateOptionsGeneral,
|
|
15
|
+
ITableRecord,
|
|
16
|
+
TypeModelWhere,
|
|
17
|
+
} from '../../types/index.ts';
|
|
18
|
+
|
|
19
|
+
import { BeanModelView } from './bean.model_view.ts';
|
|
20
|
+
|
|
21
|
+
export class BeanModelCrudInner<TRecord extends {}> extends BeanModelView<TRecord> {
|
|
22
|
+
protected async _mget(table?: keyof ITableRecord, ids?: TableIdentity[], options?: IModelGetOptionsGeneral<TRecord>): Promise<TRecord[]> {
|
|
23
|
+
const items = await this._mget_original(table, ids, options);
|
|
24
|
+
return items.filter(item => !isNil(item));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// with undefined
|
|
28
|
+
protected async _mget_original(
|
|
29
|
+
table?: keyof ITableRecord,
|
|
30
|
+
ids?: TableIdentity[],
|
|
31
|
+
options?: IModelGetOptionsGeneral<TRecord>,
|
|
32
|
+
): Promise<(TRecord | undefined)[]> {
|
|
33
|
+
// table
|
|
34
|
+
table = table || this.getTable(undefined);
|
|
35
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
36
|
+
// ids maybe empty
|
|
37
|
+
if (!ids || ids.length === 0) return [];
|
|
38
|
+
// params
|
|
39
|
+
const params: IModelSelectParams<TRecord> = {
|
|
40
|
+
where: {
|
|
41
|
+
id: ids,
|
|
42
|
+
} as any,
|
|
43
|
+
};
|
|
44
|
+
if (options?.columns) {
|
|
45
|
+
params.columns = options?.columns as any;
|
|
46
|
+
}
|
|
47
|
+
// select
|
|
48
|
+
const options2 = options?.columns ? Object.assign({}, options, { columns: undefined }) : options;
|
|
49
|
+
const items = await this._select(table, params, options2);
|
|
50
|
+
// sort
|
|
51
|
+
const result: (TRecord | undefined)[] = [];
|
|
52
|
+
for (const id of ids) {
|
|
53
|
+
// item maybe undefined
|
|
54
|
+
const item = items.find(item => cast(item).id === id);
|
|
55
|
+
result.push(item);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected async _select<T extends IModelSelectParams<TRecord>>(
|
|
61
|
+
table?: keyof ITableRecord,
|
|
62
|
+
params?: T,
|
|
63
|
+
options?: IModelMethodOptionsGeneral,
|
|
64
|
+
builder?: Knex.QueryBuilder<TRecord, TRecord[]>,
|
|
65
|
+
): Promise<TRecord[]> {
|
|
66
|
+
// table
|
|
67
|
+
table = table || this.getTable(params?.where);
|
|
68
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
69
|
+
// builder
|
|
70
|
+
builder = builder ?? this._select_buildParams(table, params as any, options);
|
|
71
|
+
// ready
|
|
72
|
+
this.$loggerChild('model').debug(() => `model.select: ${builder.toQuery()}`);
|
|
73
|
+
// datas
|
|
74
|
+
const datas = await builder;
|
|
75
|
+
return (await this.dialect.select(builder, datas, () => this.columns(table))) as TRecord[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
protected _select_buildParams<T extends IModelSelectGeneralParams<TRecord>>(
|
|
79
|
+
table: keyof ITableRecord,
|
|
80
|
+
params?: T,
|
|
81
|
+
options?: IModelMethodOptionsGeneral,
|
|
82
|
+
) {
|
|
83
|
+
// builder
|
|
84
|
+
const builder = this.builder<TRecord, TRecord>(table);
|
|
85
|
+
// groups
|
|
86
|
+
const groups = this.buildGroups(builder, params?.groups);
|
|
87
|
+
// columns
|
|
88
|
+
this.buildColumns(builder, params?.columns, groups);
|
|
89
|
+
// distinct
|
|
90
|
+
this.buildDistinct(builder, params?.distinct);
|
|
91
|
+
// aggregate
|
|
92
|
+
this.buildAggrs(builder, params?.aggrs);
|
|
93
|
+
// joins
|
|
94
|
+
this.buildJoins(builder, params?.joins);
|
|
95
|
+
// where
|
|
96
|
+
this.prepareWhere(builder, table, params?.where, options);
|
|
97
|
+
// having
|
|
98
|
+
this.prepareHaving(builder, params?.having as any);
|
|
99
|
+
// orders
|
|
100
|
+
this.buildOrders(builder, params?.orders);
|
|
101
|
+
// limit
|
|
102
|
+
this.buildLimit(builder, params?.limit);
|
|
103
|
+
// offset
|
|
104
|
+
this.buildOffset(builder, params?.offset);
|
|
105
|
+
// ok
|
|
106
|
+
return builder;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected async _get(
|
|
110
|
+
table: keyof ITableRecord | undefined,
|
|
111
|
+
where: TypeModelWhere<TRecord>,
|
|
112
|
+
options?: IModelGetOptionsGeneral<TRecord>,
|
|
113
|
+
): Promise<TRecord | undefined> {
|
|
114
|
+
// table
|
|
115
|
+
table = table || this.getTable(where);
|
|
116
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
117
|
+
// params
|
|
118
|
+
const params: IModelSelectParams<TRecord> = { where, limit: 1 };
|
|
119
|
+
if (options?.columns) {
|
|
120
|
+
params.columns = options?.columns as any;
|
|
121
|
+
}
|
|
122
|
+
// select
|
|
123
|
+
const items = await this._select(table, params, options);
|
|
124
|
+
const item = items[0];
|
|
125
|
+
if (!item) return undefined;
|
|
126
|
+
return item as unknown as TRecord;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
protected async _count(
|
|
130
|
+
table?: keyof ITableRecord,
|
|
131
|
+
params?: IModelCountParams<TRecord>,
|
|
132
|
+
options?: IModelMethodOptionsGeneral,
|
|
133
|
+
): Promise<string | undefined> {
|
|
134
|
+
// table
|
|
135
|
+
table = table || this.getTable(params?.where);
|
|
136
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
137
|
+
// params
|
|
138
|
+
params = params || {};
|
|
139
|
+
// builder
|
|
140
|
+
const builder = this.builder<TRecord>(table);
|
|
141
|
+
// count
|
|
142
|
+
this.buildCount(builder, params.column, params.distinct);
|
|
143
|
+
// joins
|
|
144
|
+
this.buildJoins(builder, params.joins);
|
|
145
|
+
// where
|
|
146
|
+
this.prepareWhere(builder, table, params.where, options);
|
|
147
|
+
// ready
|
|
148
|
+
this.$loggerChild('model').debug(() => `model.count: ${builder.toQuery()}`);
|
|
149
|
+
const res = await builder;
|
|
150
|
+
return this.extractFirstNumber(res);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
protected async _increment(
|
|
154
|
+
table?: keyof ITableRecord,
|
|
155
|
+
params?: IModelIncrementParams<TRecord>,
|
|
156
|
+
options?: IModelMethodOptionsGeneral,
|
|
157
|
+
): Promise<number> {
|
|
158
|
+
// table
|
|
159
|
+
table = table || this.getTable(params?.where);
|
|
160
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
161
|
+
// params
|
|
162
|
+
params = params || ({} as unknown as IModelIncrementParams<TRecord>);
|
|
163
|
+
// builder
|
|
164
|
+
const builder = this.builder<TRecord>(table);
|
|
165
|
+
// count
|
|
166
|
+
this.buildIncrement(builder, params.columns);
|
|
167
|
+
// joins
|
|
168
|
+
this.buildJoins(builder, params.joins);
|
|
169
|
+
// where
|
|
170
|
+
this.prepareWhere(builder, table, params.where, options);
|
|
171
|
+
// ready
|
|
172
|
+
this.$loggerChild('model').debug(() => `model.increment: ${builder.toQuery()}`);
|
|
173
|
+
const res = await builder;
|
|
174
|
+
return res as unknown as number;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
protected async _insertBulk(
|
|
178
|
+
table?: keyof ITableRecord,
|
|
179
|
+
data?: Partial<TRecord> | Partial<TRecord>[],
|
|
180
|
+
options?: IModelMethodOptionsGeneral,
|
|
181
|
+
): Promise<TRecord | TRecord[]> {
|
|
182
|
+
// data
|
|
183
|
+
data = data || ({} as any);
|
|
184
|
+
const datasTemp = Array.isArray(data) ? data : [data];
|
|
185
|
+
// table
|
|
186
|
+
table = table || this.getTable(datasTemp[0]);
|
|
187
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
188
|
+
// options
|
|
189
|
+
const datas: any[] = [];
|
|
190
|
+
const datasOriginal: any[] = [];
|
|
191
|
+
for (const dataTemp of datasTemp) {
|
|
192
|
+
// first
|
|
193
|
+
const dataTemp2 = this._prepareInsertDataByOptions(table, dataTemp, options);
|
|
194
|
+
// then
|
|
195
|
+
const [dataNew, dataNewOriginal] = await this.prepareData(table, dataTemp2);
|
|
196
|
+
if (isNil(cast(dataNewOriginal).id) && Object.prototype.hasOwnProperty.call(dataNewOriginal, 'id')) {
|
|
197
|
+
delete cast(dataNewOriginal).id;
|
|
198
|
+
}
|
|
199
|
+
datas.push(dataNew);
|
|
200
|
+
datasOriginal.push(dataNewOriginal);
|
|
201
|
+
}
|
|
202
|
+
// builder
|
|
203
|
+
const builder = this.builder<TRecord>(table);
|
|
204
|
+
// // debug
|
|
205
|
+
// this.$loggerChild('model').debug(() => `model.insert: ${builder.toQuery()}`);
|
|
206
|
+
// dialect insert
|
|
207
|
+
const ids = await this.dialect.insert(builder, datas);
|
|
208
|
+
// combine
|
|
209
|
+
const result: any[] = [];
|
|
210
|
+
const dataDefault = await this.defaultData(table);
|
|
211
|
+
for (let index = 0; index < ids.length; index++) {
|
|
212
|
+
const dataWithId: any = {};
|
|
213
|
+
if (ids[index] !== undefined) dataWithId.id = ids[index];
|
|
214
|
+
// datasOriginal[index] maybe has id
|
|
215
|
+
result.push(Object.assign({}, dataDefault, dataWithId, datasOriginal[index]));
|
|
216
|
+
}
|
|
217
|
+
// ok
|
|
218
|
+
return Array.isArray(data) ? result : result[0];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
protected async _update(
|
|
222
|
+
table: keyof ITableRecord | undefined,
|
|
223
|
+
data: Partial<TRecord>,
|
|
224
|
+
options?: IModelUpdateOptionsGeneral<TRecord>,
|
|
225
|
+
): Promise<Partial<TRecord>> {
|
|
226
|
+
// table
|
|
227
|
+
table = table || this.getTable(data);
|
|
228
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
229
|
+
// data
|
|
230
|
+
[data] = await this.prepareData(table, data);
|
|
231
|
+
// where
|
|
232
|
+
const where = Object.assign({}, options?.where);
|
|
233
|
+
// id
|
|
234
|
+
const columnId = `${table}.id`;
|
|
235
|
+
for (const key of ['id', columnId]) {
|
|
236
|
+
if (!isNil(data[key])) {
|
|
237
|
+
cast(where).id = data[key];
|
|
238
|
+
delete data[key];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// disableUpdateTime
|
|
242
|
+
if (!this._checkDisableUpdateTimeByOptions(options)) {
|
|
243
|
+
cast(data).updatedAt = new Date();
|
|
244
|
+
}
|
|
245
|
+
// builder
|
|
246
|
+
const builder = this.builder<TRecord>(table);
|
|
247
|
+
// update
|
|
248
|
+
builder.update(data as any);
|
|
249
|
+
// where
|
|
250
|
+
this.prepareWhere(builder, table, where, options);
|
|
251
|
+
// debug
|
|
252
|
+
this.$loggerChild('model').debug(() => `model.update: ${builder.toQuery()}`);
|
|
253
|
+
// ready
|
|
254
|
+
await builder;
|
|
255
|
+
// ok
|
|
256
|
+
return data;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
protected async _delete(table?: keyof ITableRecord, where?: TypeModelWhere<TRecord>, options?: IModelMethodOptionsGeneral): Promise<void> {
|
|
260
|
+
// table
|
|
261
|
+
table = table || this.getTable(where);
|
|
262
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
263
|
+
// disableDeleted
|
|
264
|
+
if (!this._checkDisableDeletedByOptions(options)) {
|
|
265
|
+
// need not set options2: disableDeleted: true, deleted: undefined
|
|
266
|
+
const options2 = Object.assign({}, options, { where });
|
|
267
|
+
await this._update(table, { deleted: true } as any, options2);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
// builder
|
|
271
|
+
const builder = this.builder<TRecord>(table);
|
|
272
|
+
// delete
|
|
273
|
+
builder.delete();
|
|
274
|
+
// where
|
|
275
|
+
this.prepareWhere(builder, table, where, options);
|
|
276
|
+
// debug
|
|
277
|
+
this.$loggerChild('model').debug(() => `model.delete: ${builder.toQuery()}`);
|
|
278
|
+
// ready
|
|
279
|
+
await builder;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { TableIdentity } from 'table-identity';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
IModelCountParams,
|
|
5
|
+
IModelGetOptionsGeneral,
|
|
6
|
+
IModelMethodOptionsGeneral,
|
|
7
|
+
IModelSelectParams,
|
|
8
|
+
IModelUpdateOptionsGeneral,
|
|
9
|
+
ITableRecord,
|
|
10
|
+
TypeModelWhere,
|
|
11
|
+
} from '../../types/index.ts';
|
|
12
|
+
|
|
13
|
+
import { BeanModelCrudInner } from './bean.model_crud_inner.ts';
|
|
14
|
+
|
|
15
|
+
export class BeanModelCrudTable<TRecord extends {}> extends BeanModelCrudInner<TRecord> {
|
|
16
|
+
async mget(
|
|
17
|
+
table: keyof ITableRecord,
|
|
18
|
+
ids: TableIdentity[],
|
|
19
|
+
options?: Omit<IModelGetOptionsGeneral<TRecord>, 'include' | 'with'>,
|
|
20
|
+
): Promise<TRecord[]> {
|
|
21
|
+
return await this._mget(table, ids, options);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async select(
|
|
25
|
+
table: keyof ITableRecord,
|
|
26
|
+
params?: Omit<IModelSelectParams<TRecord>, 'include' | 'with'>,
|
|
27
|
+
options?: IModelMethodOptionsGeneral,
|
|
28
|
+
): Promise<TRecord[]> {
|
|
29
|
+
return await this._select(table, params, options);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async get(
|
|
33
|
+
table: keyof ITableRecord,
|
|
34
|
+
where: TypeModelWhere<TRecord>,
|
|
35
|
+
options?: Omit<IModelGetOptionsGeneral<TRecord>, 'include' | 'with'>,
|
|
36
|
+
): Promise<TRecord | undefined> {
|
|
37
|
+
return await this._get(table, where, options);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async count(table: keyof ITableRecord, params?: IModelCountParams<TRecord>, options?: IModelMethodOptionsGeneral): Promise<string | undefined> {
|
|
41
|
+
return await this._count(table, params, options);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async insert(table: keyof ITableRecord, data?: Partial<TRecord>, options?: IModelMethodOptionsGeneral): Promise<TRecord> {
|
|
45
|
+
return (await this._insertBulk(table, data, options)) as Promise<TRecord>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async insertBulk(table: keyof ITableRecord, data: Partial<TRecord>[], options?: IModelMethodOptionsGeneral): Promise<TRecord[]> {
|
|
49
|
+
return (await this._insertBulk(table, data, options)) as Promise<TRecord[]>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async update(table: keyof ITableRecord, data: Partial<TRecord>, options?: IModelUpdateOptionsGeneral<TRecord>): Promise<Partial<TRecord>> {
|
|
53
|
+
return await this._update(table, data, options);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async delete(table: keyof ITableRecord, where?: TypeModelWhere<TRecord>, options?: IModelMethodOptionsGeneral): Promise<void> {
|
|
57
|
+
return await this._delete(table, where, options);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
import type { IModelMethodOptionsGeneral, ITableRecord } from '../../types/index.ts';
|
|
4
|
+
|
|
5
|
+
import { BeanModelUtils } from './bean.model_utils.ts';
|
|
6
|
+
|
|
7
|
+
export class BeanModelKnex<TRecord extends {}> extends BeanModelUtils<TRecord> {
|
|
8
|
+
get schema(): Knex.SchemaBuilder {
|
|
9
|
+
return this.connection.schema;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
builder<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(table?: Knex.TableDescriptor): Knex.QueryBuilder<TRecord2, TResult2[]> {
|
|
13
|
+
// table
|
|
14
|
+
table = table || this.getTable(undefined);
|
|
15
|
+
if (table) {
|
|
16
|
+
return this.connection(table);
|
|
17
|
+
}
|
|
18
|
+
return this.connection.queryBuilder<TRecord2, TResult2[]>();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
builderSelect<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(options?: IModelMethodOptionsGeneral): Knex.QueryBuilder<TRecord2, TResult2[]>;
|
|
22
|
+
builderSelect<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(
|
|
23
|
+
table: keyof ITableRecord,
|
|
24
|
+
options?: IModelMethodOptionsGeneral,
|
|
25
|
+
): Knex.QueryBuilder<TRecord2, TResult2[]>;
|
|
26
|
+
builderSelect<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(table?, options?): Knex.QueryBuilder<TRecord2, TResult2[]> {
|
|
27
|
+
if (typeof table !== 'string') {
|
|
28
|
+
options = table;
|
|
29
|
+
table = undefined;
|
|
30
|
+
}
|
|
31
|
+
// table
|
|
32
|
+
table = table || this.getTable(undefined);
|
|
33
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
34
|
+
// builder
|
|
35
|
+
const builder = this.builder<TRecord2, TResult2>(table);
|
|
36
|
+
// where
|
|
37
|
+
this.prepareWhere(builder, table, {}, options);
|
|
38
|
+
// ready
|
|
39
|
+
return builder;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async query(value: Knex.Value): Promise<TRecord[]>;
|
|
43
|
+
async query(sql: string, binding: Knex.RawBinding): Promise<TRecord[]>;
|
|
44
|
+
async query(sql: string, bindings: readonly Knex.RawBinding[] | Knex.ValueDict): Promise<TRecord[]>;
|
|
45
|
+
async query(sql, bindings?): Promise<TRecord[]> {
|
|
46
|
+
const raw = this.connection.raw(sql, bindings);
|
|
47
|
+
const result = await raw;
|
|
48
|
+
// dialect
|
|
49
|
+
return this.dialect.query(result) as unknown as TRecord[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async queryOne(value: Knex.Value): Promise<TRecord | undefined>;
|
|
53
|
+
async queryOne(sql: string, binding: Knex.RawBinding): Promise<TRecord | undefined>;
|
|
54
|
+
async queryOne(sql: string, bindings: readonly Knex.RawBinding[] | Knex.ValueDict): Promise<TRecord | undefined>;
|
|
55
|
+
async queryOne(sql, bindings?): Promise<TRecord | undefined> {
|
|
56
|
+
const res = await this.query(sql, bindings);
|
|
57
|
+
if (!res[0]) return undefined;
|
|
58
|
+
return res[0];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { isNil } from '@cabloy/utils';
|
|
2
|
+
import { appResource, BeanBase, cast } from 'vona';
|
|
3
|
+
import { $tableNameFromEntity } from 'vona-module-a-ormutils';
|
|
4
|
+
|
|
5
|
+
import type { ServiceDb } from '../../service/db_.ts';
|
|
6
|
+
import type {
|
|
7
|
+
IDatabaseClientRecord,
|
|
8
|
+
IDecoratorModelOptions,
|
|
9
|
+
IModelClassRecord,
|
|
10
|
+
IModelMethodOptionsGeneral,
|
|
11
|
+
IModelUpdateOptionsGeneral,
|
|
12
|
+
ITableRecord,
|
|
13
|
+
TypeEntityMeta,
|
|
14
|
+
TypeModelClassLike,
|
|
15
|
+
TypeModelOptionsTable,
|
|
16
|
+
TypeModelRelationOptionsMetaClient,
|
|
17
|
+
} from '../../types/index.ts';
|
|
18
|
+
import type { BeanModel } from '../bean.model.ts';
|
|
19
|
+
|
|
20
|
+
import { getTableOrTableAlias, prepareClassModel } from '../../common/utils.ts';
|
|
21
|
+
import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from '../../types/index.ts';
|
|
22
|
+
|
|
23
|
+
const SymbolModelDb = Symbol('SymbolModelDb');
|
|
24
|
+
const SymbolModelTable = Symbol('SymbolModelTable');
|
|
25
|
+
|
|
26
|
+
export class BeanModelMeta<TRecord extends {} = {}> extends BeanBase {
|
|
27
|
+
public [SymbolKeyEntity]: TRecord;
|
|
28
|
+
public [SymbolKeyEntityMeta]: TypeEntityMeta<TRecord>;
|
|
29
|
+
public [SymbolKeyModelOptions]: IDecoratorModelOptions;
|
|
30
|
+
|
|
31
|
+
private [SymbolModelDb]?: ServiceDb;
|
|
32
|
+
private [SymbolModelTable]?: TypeModelOptionsTable;
|
|
33
|
+
|
|
34
|
+
protected __init__(clientName?: keyof IDatabaseClientRecord | ServiceDb, table?: TypeModelOptionsTable) {
|
|
35
|
+
// clientName
|
|
36
|
+
if (!isNil(clientName)) {
|
|
37
|
+
if (typeof clientName === 'string') {
|
|
38
|
+
this[SymbolModelDb] = this.bean.database.getDb(clientName);
|
|
39
|
+
} else {
|
|
40
|
+
this[SymbolModelDb] = clientName;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// table
|
|
44
|
+
this[SymbolModelTable] = table;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected get self() {
|
|
48
|
+
return cast<BeanModel>(this);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected get connection() {
|
|
52
|
+
return this.db.connection;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
protected get dialect() {
|
|
56
|
+
return this.db.dialect;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public get scopeOrm() {
|
|
60
|
+
return this.$scope.orm;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public get modelViewRecord() {
|
|
64
|
+
return this.$scope.version.model.viewRecord;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public get db() {
|
|
68
|
+
return this[SymbolModelDb] ?? this._getDb();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private _getDb() {
|
|
72
|
+
let clientName = this.options.client;
|
|
73
|
+
// use current
|
|
74
|
+
if (!clientName) return this.bean.database.current;
|
|
75
|
+
// custom clientName
|
|
76
|
+
if (typeof clientName === 'function') {
|
|
77
|
+
clientName = clientName(this.ctx, this);
|
|
78
|
+
}
|
|
79
|
+
// db
|
|
80
|
+
return this.bean.database.getDb(clientName);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getTable(where: object | undefined): keyof ITableRecord {
|
|
84
|
+
return this._getTable(where);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private _getTable(where: object | undefined) {
|
|
88
|
+
const table = this[SymbolModelTable] ?? this.options.table;
|
|
89
|
+
if (table && typeof table === 'string') return table;
|
|
90
|
+
const defaultTable = this.options.entity && $tableNameFromEntity(this.options.entity);
|
|
91
|
+
if (table && typeof table === 'function') {
|
|
92
|
+
return table(this.ctx, where, defaultTable!, this) as any;
|
|
93
|
+
}
|
|
94
|
+
if (defaultTable) return defaultTable;
|
|
95
|
+
throw new Error(`not found table of ${this.$beanFullName}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
get options(): IDecoratorModelOptions {
|
|
99
|
+
return (this.$beanOptions.options || {}) as IDecoratorModelOptions;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
get disableInstance() {
|
|
103
|
+
return this.options.disableInstance ?? this.scopeOrm.config.model.disableInstance;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
get disableDeleted() {
|
|
107
|
+
return this.options.disableDeleted ?? this.scopeOrm.config.model.disableDeleted;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
get disableCreateTime() {
|
|
111
|
+
return this.options.disableCreateTime ?? this.scopeOrm.config.model.disableCreateTime;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
get disableUpdateTime() {
|
|
115
|
+
return this.options.disableUpdateTime ?? this.scopeOrm.config.model.disableUpdateTime;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
protected _prepareDisableInstanceByOptions(table: keyof ITableRecord, data: any, options?: IModelMethodOptionsGeneral, useRaw?: boolean) {
|
|
119
|
+
const columnNameInstance = useRaw ? 'iid' : `${getTableOrTableAlias(table)}.iid`;
|
|
120
|
+
if (this._checkDisableInstanceByOptions(options)) {
|
|
121
|
+
delete data.iid;
|
|
122
|
+
delete data[columnNameInstance];
|
|
123
|
+
} else {
|
|
124
|
+
delete data.iid;
|
|
125
|
+
if (!this.ctx.instance) {
|
|
126
|
+
throw new Error('ctx.instance not exists');
|
|
127
|
+
}
|
|
128
|
+
data[columnNameInstance] = this.ctx.instance.id;
|
|
129
|
+
}
|
|
130
|
+
return data;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
protected _prepareDisableDeletedByOptions(table: keyof ITableRecord, data: any, options?: IModelMethodOptionsGeneral, useRaw?: boolean) {
|
|
134
|
+
const columnNameDeleted = useRaw ? 'deleted' : `${getTableOrTableAlias(table)}.deleted`;
|
|
135
|
+
const deleted = this._prepareDisableDeletedByOptionsSimple(options);
|
|
136
|
+
if (!isNil(deleted)) {
|
|
137
|
+
delete data.deleted; // force
|
|
138
|
+
data[columnNameDeleted] = deleted;
|
|
139
|
+
}
|
|
140
|
+
return data;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
protected _prepareDisableDeletedByOptionsSimple(options?: IModelMethodOptionsGeneral): boolean | undefined {
|
|
144
|
+
if (!isNil(options?.deleted)) {
|
|
145
|
+
if (!this.disableDeleted) {
|
|
146
|
+
return options?.deleted;
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
if (this._checkDisableDeletedByOptions(options)) {
|
|
150
|
+
// do nothing
|
|
151
|
+
} else {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
protected _checkIfEntityValidByDeleted(entity: any, options?: IModelMethodOptionsGeneral) {
|
|
159
|
+
const deleted = this._prepareDisableDeletedByOptionsSimple(options);
|
|
160
|
+
return isNil(deleted) || Boolean(entity.deleted) === Boolean(deleted);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
protected _checkDisableInstanceByOptions(_options?: IModelMethodOptionsGeneral) {
|
|
164
|
+
return this.disableInstance;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
protected _checkDisableDeletedByOptions(options?: IModelMethodOptionsGeneral) {
|
|
168
|
+
if (this.disableDeleted) return true;
|
|
169
|
+
return options?.disableDeleted ?? this.disableDeleted;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
protected _checkDisableCreateTimeByOptions(options?: IModelUpdateOptionsGeneral<TRecord>) {
|
|
173
|
+
return options?.disableCreateTime ?? this.disableCreateTime;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
protected _checkDisableUpdateTimeByOptions(options?: IModelUpdateOptionsGeneral<TRecord>) {
|
|
177
|
+
return options?.disableUpdateTime ?? this.disableUpdateTime;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public newInstance(client?: keyof IDatabaseClientRecord | ServiceDb, table?: TypeModelOptionsTable): this {
|
|
181
|
+
return this.app.bean._newBean(this.$beanFullName as any, client ?? this.db, table);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public newInstanceTarget<MODEL extends BeanModelMeta | keyof IModelClassRecord>(
|
|
185
|
+
modelClassTarget: TypeModelClassLike<MODEL>,
|
|
186
|
+
client?: TypeModelRelationOptionsMetaClient,
|
|
187
|
+
table?: TypeModelOptionsTable,
|
|
188
|
+
): BeanModelMeta {
|
|
189
|
+
const modelClass2 = prepareClassModel(modelClassTarget);
|
|
190
|
+
const beanOptions = appResource.getBean(modelClass2);
|
|
191
|
+
const beanFullName = beanOptions!.beanFullName;
|
|
192
|
+
const options = beanOptions?.options as IDecoratorModelOptions | undefined;
|
|
193
|
+
// client
|
|
194
|
+
if (isNil(client) || client === '_auto_') {
|
|
195
|
+
client = options?.client ? '_initial_' : '_inherit_';
|
|
196
|
+
}
|
|
197
|
+
if (client === '_initial_') {
|
|
198
|
+
return this.app.bean._newBean(beanFullName as any, undefined, table);
|
|
199
|
+
} else if (client === '_inherit_') {
|
|
200
|
+
client = this.db;
|
|
201
|
+
}
|
|
202
|
+
return this.app.bean._newBean(beanFullName as any, client ?? this.db, table);
|
|
203
|
+
}
|
|
204
|
+
}
|