vona-module-a-orm 5.0.96 → 5.1.2
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 +1 -0
- 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 +94 -15
- 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,275 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
import { ensureArray, isNil } from '@cabloy/utils';
|
|
4
|
+
import { cast } from 'vona';
|
|
5
|
+
import { $tableDefaults } from 'vona-module-a-ormutils';
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
IModelMethodOptionsGeneral,
|
|
9
|
+
IModelSelectParamsJoin,
|
|
10
|
+
IModelSelectParamsPage,
|
|
11
|
+
ITableColumns,
|
|
12
|
+
ITableRecord,
|
|
13
|
+
TypeModelColumn,
|
|
14
|
+
TypeModelColumns,
|
|
15
|
+
TypeModelColumnsStrict,
|
|
16
|
+
TypeModelIncrementParamsColumns,
|
|
17
|
+
TypeModelSelectAggrParamsAggrs,
|
|
18
|
+
TypeModelSelectGroupParamsColumns,
|
|
19
|
+
TypeModelWhere,
|
|
20
|
+
} from '../../types/index.ts';
|
|
21
|
+
|
|
22
|
+
import { buildWhere } from '../../common/buildWhere.ts';
|
|
23
|
+
import { isRaw } from '../../common/utils.ts';
|
|
24
|
+
import { BeanModelMeta } from './bean.model_meta.ts';
|
|
25
|
+
|
|
26
|
+
export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
|
|
27
|
+
async prepareData(item?: Partial<TRecord>): Promise<[TRecord, TRecord]>;
|
|
28
|
+
async prepareData(table: keyof ITableRecord, item?: Partial<TRecord>): Promise<[TRecord, TRecord]>;
|
|
29
|
+
async prepareData(table?, item?): Promise<[TRecord, TRecord]> {
|
|
30
|
+
if (typeof table !== 'string') {
|
|
31
|
+
item = table;
|
|
32
|
+
table = undefined;
|
|
33
|
+
}
|
|
34
|
+
// table
|
|
35
|
+
table = table || this.getTable(item);
|
|
36
|
+
if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
|
|
37
|
+
// item
|
|
38
|
+
if (!item) return [{}, {}] as [TRecord, TRecord];
|
|
39
|
+
// columns
|
|
40
|
+
const columns = await this.columns(table);
|
|
41
|
+
// data
|
|
42
|
+
const data = {};
|
|
43
|
+
const dataOriginal = {};
|
|
44
|
+
for (const columnName in columns) {
|
|
45
|
+
const column = columns[columnName];
|
|
46
|
+
if (Object.prototype.hasOwnProperty.call(item, columnName)) {
|
|
47
|
+
let value = item[columnName];
|
|
48
|
+
dataOriginal[columnName] = value;
|
|
49
|
+
if (column.type === 'json' && value !== undefined) {
|
|
50
|
+
value = JSON.stringify(value);
|
|
51
|
+
}
|
|
52
|
+
data[columnName] = value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return [data, dataOriginal] as [TRecord, TRecord];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async defaultData(table?: keyof ITableRecord): Promise<TRecord> {
|
|
59
|
+
if (this.options.entity) {
|
|
60
|
+
return $tableDefaults(this.options.entity) as any;
|
|
61
|
+
}
|
|
62
|
+
table = table || this.getTable(undefined);
|
|
63
|
+
return (await this.db.columns.defaultData(table)) as TRecord;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async columns(table?: keyof ITableRecord): Promise<ITableColumns> {
|
|
67
|
+
table = table || this.getTable(undefined);
|
|
68
|
+
return await this.db.columns.columns(table);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
isRaw(raw) {
|
|
72
|
+
return isRaw(raw);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
raw(value: Knex.Value): Knex.Raw<any>;
|
|
76
|
+
raw<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(sql: string, binding: Knex.RawBinding): Knex.Raw<TResult2>;
|
|
77
|
+
raw<TRecord2 extends {} = TRecord, TResult2 = TRecord2>(sql: string, bindings: readonly Knex.RawBinding[] | Knex.ValueDict): Knex.Raw<TResult2>;
|
|
78
|
+
raw(sql, bindings?) {
|
|
79
|
+
return this.connection.raw(sql, bindings);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
ref<TSrc extends string>(src: TSrc): Knex.Ref<TSrc, { [K in TSrc]: TSrc }> {
|
|
83
|
+
return this.connection.ref<TSrc>(src);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
toIdentifier(name: string | string[]): Knex.Raw<any> {
|
|
87
|
+
const parts = Array.isArray(name) ? name : name.split(',');
|
|
88
|
+
return this.raw(parts.map(_ => '??').join(','), parts);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// checkWhere(where: TypeModelWhere<TRecord>) {
|
|
92
|
+
// return checkWhere(where);
|
|
93
|
+
// }
|
|
94
|
+
|
|
95
|
+
buildWhere(builder: Knex.QueryBuilder, wheres?: TypeModelWhere<TRecord>) {
|
|
96
|
+
if (!wheres) return;
|
|
97
|
+
return buildWhere(this.db, builder, wheres);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
buildJoin(builder: Knex.QueryBuilder, join?: IModelSelectParamsJoin<TRecord, ''>) {
|
|
101
|
+
if (!join) return;
|
|
102
|
+
const [joinType, joinTable, joinOn] = join;
|
|
103
|
+
builder[joinType](joinTable, cast(joinOn));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
buildJoins(builder: Knex.QueryBuilder, joins?: IModelSelectParamsJoin<TRecord, ''>[]) {
|
|
107
|
+
if (!joins) return;
|
|
108
|
+
for (const [joinType, joinTable, joinOn] of joins) {
|
|
109
|
+
if (Array.isArray(joinOn)) {
|
|
110
|
+
cast(builder)[joinType](joinTable, ...joinOn);
|
|
111
|
+
} else {
|
|
112
|
+
builder[joinType](joinTable, joinOn);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
buildDistinct(builder: Knex.QueryBuilder, distinct?: boolean | keyof TRecord | (keyof TRecord)[]) {
|
|
118
|
+
if (distinct === undefined || distinct === false) return;
|
|
119
|
+
if (distinct === true) {
|
|
120
|
+
builder.distinct();
|
|
121
|
+
} else if (Array.isArray(distinct)) {
|
|
122
|
+
builder.distinct(...distinct);
|
|
123
|
+
} else {
|
|
124
|
+
builder.distinct(distinct);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
buildCount(builder: Knex.QueryBuilder, column?: TypeModelColumn<TRecord>, distinct?: boolean | keyof TRecord | (keyof TRecord)[]) {
|
|
129
|
+
if (column !== undefined) {
|
|
130
|
+
builder.count(column);
|
|
131
|
+
} else if (distinct !== undefined && distinct !== false) {
|
|
132
|
+
builder.count(this.raw(`distinct ${this.toIdentifier(distinct as any)}`));
|
|
133
|
+
} else {
|
|
134
|
+
builder.count();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
buildIncrement(builder: Knex.QueryBuilder, columns: TypeModelIncrementParamsColumns<TRecord>) {
|
|
139
|
+
builder.increment(columns as any);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
buildOrders(builder: Knex.QueryBuilder, orders) {
|
|
143
|
+
if (!orders) return;
|
|
144
|
+
for (const [orderColumn, orderDirection, orderNulls] of orders) {
|
|
145
|
+
builder.orderBy(orderColumn, orderDirection, orderNulls);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
buildLimit(builder: Knex.QueryBuilder, limit?: number) {
|
|
150
|
+
if (limit !== 0 && limit !== undefined) {
|
|
151
|
+
builder.limit(limit);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
buildOffset(builder: Knex.QueryBuilder, offset?: number) {
|
|
156
|
+
if (offset !== undefined) {
|
|
157
|
+
builder.offset(offset);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
buildColumns(builder: Knex.QueryBuilder, columns?: TypeModelColumns<TRecord>, groups?: (keyof TRecord)[] | undefined) {
|
|
162
|
+
if (columns) {
|
|
163
|
+
builder.select(columns as any);
|
|
164
|
+
} else if (groups) {
|
|
165
|
+
builder.select(groups);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
buildGroups(builder: Knex.QueryBuilder, groups?: TypeModelColumnsStrict<TRecord>) {
|
|
170
|
+
if (!groups) return;
|
|
171
|
+
groups = ensureArray(groups)!;
|
|
172
|
+
builder.groupBy(groups);
|
|
173
|
+
return groups;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
buildAggrs(builder: Knex.QueryBuilder, aggrs?: TypeModelSelectAggrParamsAggrs<TRecord>) {
|
|
177
|
+
if (!aggrs) return;
|
|
178
|
+
for (const key in aggrs) {
|
|
179
|
+
const columns = ensureArray(aggrs[key]);
|
|
180
|
+
if (!columns) continue;
|
|
181
|
+
for (const column of columns) {
|
|
182
|
+
const column2 = `${key}_${column === '*' ? 'all' : column}`;
|
|
183
|
+
builder[key](column, { as: column2 });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
buildPage(builder: Knex.QueryBuilder, page?: IModelSelectParamsPage) {
|
|
189
|
+
if (!page) return;
|
|
190
|
+
this.buildLimit(builder, page.size);
|
|
191
|
+
this.buildOffset(builder, page.index);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
prepareHaving(builder: Knex.QueryBuilder, having?: TypeModelWhere<TRecord, TypeModelSelectGroupParamsColumns<TRecord>>) {
|
|
195
|
+
if (!having) return;
|
|
196
|
+
this.buildHaving(builder, having);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
buildHaving(builder: Knex.QueryBuilder, having: TypeModelWhere<TRecord, TypeModelSelectGroupParamsColumns<TRecord>>) {
|
|
200
|
+
return buildWhere(this.db, builder, having, true);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
prepareWhere(builder: Knex.QueryBuilder, table?: keyof ITableRecord, where?: TypeModelWhere<TRecord>, options?: IModelMethodOptionsGeneral) {
|
|
204
|
+
// table
|
|
205
|
+
table = table || this.getTable(where);
|
|
206
|
+
if (!table) throw new Error('should specify the table name');
|
|
207
|
+
// disableInstance/disableDeleted
|
|
208
|
+
where = Object.assign({}, where);
|
|
209
|
+
where = this._prepareWhereByOptions(table, where, options);
|
|
210
|
+
// build
|
|
211
|
+
this.buildWhere(builder, where);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
extractCount(result: Array<object> | object, columnName?: string): string {
|
|
215
|
+
return this.extractFirstNumber(result, 0, columnName)!;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
extractFirstNumber<T = number | string | undefined>(
|
|
219
|
+
result: Array<object> | object,
|
|
220
|
+
defaultValue?: T,
|
|
221
|
+
columnName?: string,
|
|
222
|
+
): T extends undefined ? string | undefined : string {
|
|
223
|
+
const value = this.extractFirstValue(result, defaultValue, columnName);
|
|
224
|
+
if (value === undefined || value === null) return undefined as any;
|
|
225
|
+
return String(value);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
extractFirstValue(result: Array<object> | object, defaultValue?: any, columnName?: string): any | undefined {
|
|
229
|
+
const value = this._extractFirstValue(result, columnName);
|
|
230
|
+
if (value === undefined || value === null) return defaultValue;
|
|
231
|
+
return value;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
private _extractFirstValue(result: Array<object> | object, columnName?: string): any | undefined {
|
|
235
|
+
const res = Array.isArray(result) ? result[0] : result;
|
|
236
|
+
if (!res) return undefined;
|
|
237
|
+
if (columnName) return res[columnName];
|
|
238
|
+
const keys = Object.keys(res);
|
|
239
|
+
if (keys.length === 0) return undefined;
|
|
240
|
+
return res[keys[0]];
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
protected _prepareWhereByOptions(table: keyof ITableRecord, where, options?: IModelMethodOptionsGeneral) {
|
|
244
|
+
// disableInstance: should not check if specified
|
|
245
|
+
where = this._prepareDisableInstanceByOptions(table, where, options);
|
|
246
|
+
// disableDeleted: should not check if specified
|
|
247
|
+
where = this._prepareDisableDeletedByOptions(table, where, options);
|
|
248
|
+
// ok
|
|
249
|
+
return where;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
protected _prepareInsertDataByOptions(table: keyof ITableRecord, data, options?: IModelMethodOptionsGeneral) {
|
|
253
|
+
let result = Object.assign({}, data);
|
|
254
|
+
// disableInstance: should not check if specified
|
|
255
|
+
result = this._prepareDisableInstanceByOptions(table, result, options, true);
|
|
256
|
+
// disableDeleted: should not check if specified
|
|
257
|
+
result = this._prepareDisableDeletedByOptions(table, result, options, true);
|
|
258
|
+
// createdAt/updatedAt
|
|
259
|
+
if (isNil(result.createdAt)) {
|
|
260
|
+
if (!this._checkDisableCreateTimeByOptions(options)) {
|
|
261
|
+
result.createdAt = new Date();
|
|
262
|
+
} else {
|
|
263
|
+
delete result.createdAt;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (isNil(result.updatedAt)) {
|
|
267
|
+
if (!this._checkDisableUpdateTimeByOptions(options)) {
|
|
268
|
+
result.updatedAt = new Date();
|
|
269
|
+
} else {
|
|
270
|
+
delete result.updatedAt;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return result;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { ISwapDepsItem } from '@cabloy/deps';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
|
|
4
|
+
import { swapDeps } from '@cabloy/deps';
|
|
5
|
+
import { cast } from 'vona';
|
|
6
|
+
|
|
7
|
+
import { BeanModelKnex } from './bean.model_knex.ts';
|
|
8
|
+
|
|
9
|
+
export class BeanModelView<TRecord extends {}> extends BeanModelKnex<TRecord> {
|
|
10
|
+
async createView(viewName: string, callback?: (viewBuilder: Knex.ViewBuilder) => any): Promise<void> {
|
|
11
|
+
if (callback) {
|
|
12
|
+
// create view
|
|
13
|
+
let _view: Knex.ViewBuilder | null = null;
|
|
14
|
+
await this.schema.createView(viewName, view => {
|
|
15
|
+
_view = view;
|
|
16
|
+
return callback(view);
|
|
17
|
+
});
|
|
18
|
+
// view sql
|
|
19
|
+
const sql = cast(_view).toSQL();
|
|
20
|
+
const viewSql = sql[0].sql;
|
|
21
|
+
// record view
|
|
22
|
+
const viewRecord = await this.modelViewRecord.get({ viewName });
|
|
23
|
+
if (viewRecord) {
|
|
24
|
+
await this.modelViewRecord.update({ id: viewRecord.id, viewSql });
|
|
25
|
+
} else {
|
|
26
|
+
await this.modelViewRecord.insert({ viewName, viewSql });
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
// get record
|
|
30
|
+
const viewRecord = await this.modelViewRecord.get({ viewName });
|
|
31
|
+
if (!viewRecord) throw new Error(`not found view record: ${viewName}`);
|
|
32
|
+
await this.raw(viewRecord.viewSql);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async dropView(viewName: string, disableRemoveRecord?: boolean) {
|
|
37
|
+
// drop view: use dropViewIfExists
|
|
38
|
+
await this.schema.dropViewIfExists(viewName);
|
|
39
|
+
// remove record
|
|
40
|
+
if (!disableRemoveRecord) {
|
|
41
|
+
await this.modelViewRecord.delete({ viewName });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async alterView(viewName: string, callback?: (viewBuilder: Knex.ViewBuilder) => any): Promise<void> {
|
|
46
|
+
await this._viewDependentsAll_handle(viewName, async () => {
|
|
47
|
+
// drop view
|
|
48
|
+
await this.dropView(viewName, true);
|
|
49
|
+
// create view
|
|
50
|
+
await this.createView(viewName, callback);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async createTable(tableName: string, callback: (tableBuilder: Knex.CreateTableBuilder) => any): Promise<void> {
|
|
55
|
+
await this.schema.createTable(tableName, callback);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async dropTable(tableName: string) {
|
|
59
|
+
await this.schema.dropTable(tableName);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async alterTable(tableName: string, callback: (tableBuilder: Knex.CreateTableBuilder) => any, alterViewAuto?: boolean): Promise<void> {
|
|
63
|
+
if (!alterViewAuto) {
|
|
64
|
+
// alter table
|
|
65
|
+
return await this.schema.alterTable(tableName, table => {
|
|
66
|
+
return callback(table);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
await this._viewDependentsAll_handle(tableName, async () => {
|
|
70
|
+
await this.schema.alterTable(tableName, table => {
|
|
71
|
+
return callback(table);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async viewDependents(viewName: string): Promise<string[]> {
|
|
77
|
+
// builder
|
|
78
|
+
const builder = this.builder();
|
|
79
|
+
// dialect
|
|
80
|
+
return await this.dialect.viewDependents(builder, viewName);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async viewDependentsAll(viewName: string): Promise<string[]> {
|
|
84
|
+
// views
|
|
85
|
+
const views: ISwapDepsItem[] = [{ name: viewName, dependencies: [] }];
|
|
86
|
+
// dependencies all
|
|
87
|
+
await this._viewDependentsAll_inner(viewName, views);
|
|
88
|
+
// swap
|
|
89
|
+
swapDeps(views);
|
|
90
|
+
// shift
|
|
91
|
+
views.shift();
|
|
92
|
+
// ready
|
|
93
|
+
return views.map(view => view.name);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private async _viewDependentsAll_inner(viewName: string, views: ISwapDepsItem[]) {
|
|
97
|
+
const dependents = await this.viewDependents(viewName);
|
|
98
|
+
for (const dependent of dependents) {
|
|
99
|
+
// dependencies
|
|
100
|
+
const view = views.find(view => view.name === dependent);
|
|
101
|
+
if (view) {
|
|
102
|
+
const dep = cast(view.dependencies).find(dep => dep.toLowerCase() === viewName.toLowerCase());
|
|
103
|
+
if (!dep) {
|
|
104
|
+
cast(view.dependencies).push(viewName);
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
views.push({ name: dependent, dependencies: [viewName] });
|
|
108
|
+
}
|
|
109
|
+
// next
|
|
110
|
+
await this._viewDependentsAll_inner(dependent, views);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private async _viewDependentsAll_handle(viewName: string, callback: () => Promise<void>) {
|
|
115
|
+
// viewDependentsAll
|
|
116
|
+
const viewDependents = await this.viewDependentsAll(viewName);
|
|
117
|
+
// drop dependents
|
|
118
|
+
for (let i = viewDependents.length - 1; i >= 0; i--) {
|
|
119
|
+
const viewDependent = viewDependents[i];
|
|
120
|
+
await this.dropView(viewDependent, true);
|
|
121
|
+
}
|
|
122
|
+
// callback
|
|
123
|
+
await callback();
|
|
124
|
+
// create dependents
|
|
125
|
+
for (const viewDependent of viewDependents) {
|
|
126
|
+
await this.createView(viewDependent);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Virtual } from 'vona';
|
|
2
|
+
import { Bean } from 'vona-module-a-bean';
|
|
3
|
+
|
|
4
|
+
import { BeanModelCrudTable } from './bean.model/bean.model_crud_table.ts';
|
|
5
|
+
|
|
6
|
+
@Bean()
|
|
7
|
+
@Virtual()
|
|
8
|
+
export class BeanModel<TRecord extends {} = any> extends BeanModelCrudTable<TRecord> {}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IBroadcastExecute } from 'vona-module-a-broadcast';
|
|
2
|
+
|
|
3
|
+
import { cast } from 'vona';
|
|
4
|
+
import { BeanBroadcastBase, Broadcast } from 'vona-module-a-broadcast';
|
|
5
|
+
|
|
6
|
+
import type { IDatabaseClientRecord } from '../types/database.ts';
|
|
7
|
+
|
|
8
|
+
export interface TypeBroadcastColumnsClearJobData {
|
|
9
|
+
clientName?: keyof IDatabaseClientRecord;
|
|
10
|
+
tableName?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@Broadcast()
|
|
14
|
+
export class BroadcastColumnsClear
|
|
15
|
+
extends BeanBroadcastBase<TypeBroadcastColumnsClearJobData>
|
|
16
|
+
implements IBroadcastExecute<TypeBroadcastColumnsClearJobData>
|
|
17
|
+
{
|
|
18
|
+
async execute(data: TypeBroadcastColumnsClearJobData, isEmitter?: boolean) {
|
|
19
|
+
const { clientName, tableName } = data;
|
|
20
|
+
if (!isEmitter) {
|
|
21
|
+
await cast(this.scope.service.database).columnsClearWorker(clientName, tableName);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BeanEventBase, Event } from 'vona-module-a-event';
|
|
2
|
+
|
|
3
|
+
import type { IDatabaseClientRecord } from '../types/database.ts';
|
|
4
|
+
|
|
5
|
+
export type TypeEventClientNameRealData = keyof IDatabaseClientRecord;
|
|
6
|
+
|
|
7
|
+
export type TypeEventClientNameRealResult = keyof IDatabaseClientRecord;
|
|
8
|
+
|
|
9
|
+
@Event()
|
|
10
|
+
export class EventClientNameReal extends BeanEventBase<TypeEventClientNameRealData, TypeEventClientNameRealResult> {}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BeanEventBase, Event } from 'vona-module-a-event';
|
|
2
|
+
|
|
3
|
+
import type { IDatabaseClientRecord } from '../types/database.ts';
|
|
4
|
+
|
|
5
|
+
export interface TypeEventColumnsClearData {
|
|
6
|
+
clientName: keyof IDatabaseClientRecord;
|
|
7
|
+
tableName?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type TypeEventColumnsClearResult = void;
|
|
11
|
+
|
|
12
|
+
@Event()
|
|
13
|
+
export class EventColumnsClear extends BeanEventBase<TypeEventColumnsClearData, TypeEventColumnsClearResult> {}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IDecoratorBeanOptionsBase } from 'vona';
|
|
2
|
+
import type { IHmrReload } from 'vona-module-a-hmr';
|
|
3
|
+
|
|
4
|
+
import { BeanBase } from 'vona';
|
|
5
|
+
import { Hmr } from 'vona-module-a-hmrbase';
|
|
6
|
+
|
|
7
|
+
@Hmr()
|
|
8
|
+
export class HmrEntity extends BeanBase implements IHmrReload {
|
|
9
|
+
async reload(_beanOptions: IDecoratorBeanOptionsBase) {
|
|
10
|
+
this.app.bean.worker.reload();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IDecoratorBeanOptionsBase } from 'vona';
|
|
2
|
+
import type { IHmrReload } from 'vona-module-a-hmr';
|
|
3
|
+
|
|
4
|
+
import { BeanBase } from 'vona';
|
|
5
|
+
import { Hmr } from 'vona-module-a-hmrbase';
|
|
6
|
+
// import { clearAllCacheModelsClear, clearCacheModelCacheInstance } from '../lib/const.ts';
|
|
7
|
+
|
|
8
|
+
@Hmr()
|
|
9
|
+
export class HmrModel extends BeanBase implements IHmrReload {
|
|
10
|
+
async reload(_beanOptions: IDecoratorBeanOptionsBase) {
|
|
11
|
+
// more deps: dto/model
|
|
12
|
+
this.app.bean.worker.reload();
|
|
13
|
+
// clearAllCacheModelsClear(this.app);
|
|
14
|
+
// await clearCacheModelCacheInstance(this.app, beanOptions.beanFullName);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IQueueExecute, IQueuePushOptions } from 'vona-module-a-queue';
|
|
2
|
+
|
|
3
|
+
import { BeanQueueBase, Queue } from 'vona-module-a-queue';
|
|
4
|
+
|
|
5
|
+
import type { IDatabaseClientRecord } from '../types/database.ts';
|
|
6
|
+
import type { ITableRecord } from '../types/onion/table.ts';
|
|
7
|
+
|
|
8
|
+
export interface TypeQueueDoubleDeleteJobData {
|
|
9
|
+
beanFullName: string;
|
|
10
|
+
clientName: keyof IDatabaseClientRecord;
|
|
11
|
+
table?: keyof ITableRecord;
|
|
12
|
+
method: 'cacheEntityDelInner' | 'cacheEntityClearInner' | 'cacheQueryClearInner';
|
|
13
|
+
args: any[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type TypeQueueDoubleDeleteJobResult = void;
|
|
17
|
+
|
|
18
|
+
@Queue({
|
|
19
|
+
options: { job: { delay: 3 * 1000 } },
|
|
20
|
+
})
|
|
21
|
+
export class QueueDoubleDelete
|
|
22
|
+
extends BeanQueueBase<TypeQueueDoubleDeleteJobData, TypeQueueDoubleDeleteJobResult>
|
|
23
|
+
implements IQueueExecute<TypeQueueDoubleDeleteJobData, TypeQueueDoubleDeleteJobResult>
|
|
24
|
+
{
|
|
25
|
+
async execute(data: TypeQueueDoubleDeleteJobData, _options?: IQueuePushOptions): Promise<TypeQueueDoubleDeleteJobResult> {
|
|
26
|
+
const beanInstance = this.app.bean._newBean(data.beanFullName as any, data.clientName, data.table);
|
|
27
|
+
await beanInstance[data.method](...data.args);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { IOnionSlice } from 'vona-module-a-onion';
|
|
2
|
+
import type { IScheduleExecute } from 'vona-module-a-schedule';
|
|
3
|
+
|
|
4
|
+
import { BeanBase } from 'vona';
|
|
5
|
+
import { Schedule } from 'vona-module-a-schedule';
|
|
6
|
+
|
|
7
|
+
import type { IModelRecord, ISoftDeletionPrune } from '../types/onion/model.ts';
|
|
8
|
+
import type { BeanModelCache } from './bean.model/bean.model_cache.ts';
|
|
9
|
+
|
|
10
|
+
@Schedule({ repeat: { every: 24 * 3600 * 1000 } })
|
|
11
|
+
export class ScheduleSoftDeletionPrune extends BeanBase implements IScheduleExecute {
|
|
12
|
+
async execute() {
|
|
13
|
+
const onionSlices = this.bean.onion.model.getOnionsEnabledCached();
|
|
14
|
+
for (const onionSlice of onionSlices) {
|
|
15
|
+
if (onionSlice.beanOptions.options?.disableDeleted) continue;
|
|
16
|
+
let softDeletionPrune = onionSlice.beanOptions.options?.softDeletionPrune ?? this.scope.config.softDeletionPrune.enable;
|
|
17
|
+
if (!softDeletionPrune) continue;
|
|
18
|
+
if (softDeletionPrune === true) softDeletionPrune = {};
|
|
19
|
+
await this._modulePrune(onionSlice, softDeletionPrune);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private async _modulePrune<MODULE extends BeanModelCache, T extends keyof IModelRecord>(
|
|
24
|
+
onionSlice: IOnionSlice<IModelRecord, T, unknown>,
|
|
25
|
+
softDeletionPrune: ISoftDeletionPrune,
|
|
26
|
+
) {
|
|
27
|
+
const handler = softDeletionPrune.handler;
|
|
28
|
+
const expired = softDeletionPrune.expired ?? this.scope.config.softDeletionPrune.expired;
|
|
29
|
+
const modelTarget = this.bean._getBean<MODULE>(onionSlice.beanOptions.beanFullName as any);
|
|
30
|
+
if (handler) {
|
|
31
|
+
await handler(this.ctx, modelTarget, { expired });
|
|
32
|
+
} else {
|
|
33
|
+
const expiredTime = new Date(Date.now() - expired);
|
|
34
|
+
await modelTarget.delete(
|
|
35
|
+
{
|
|
36
|
+
deleted: true,
|
|
37
|
+
updatedAt: {
|
|
38
|
+
_lt_: expiredTime,
|
|
39
|
+
},
|
|
40
|
+
} as any,
|
|
41
|
+
{ disableDeleted: true },
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|