From e836f351655b0fe8e1b68d530acf28f23ea4842f Mon Sep 17 00:00:00 2001 From: pincman Date: Fri, 10 May 2024 00:54:36 +0800 Subject: [PATCH] update --- node/mikroorm-for-autofeature/functions.ts | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 node/mikroorm-for-autofeature/functions.ts diff --git a/node/mikroorm-for-autofeature/functions.ts b/node/mikroorm-for-autofeature/functions.ts new file mode 100644 index 0000000..8381ce7 --- /dev/null +++ b/node/mikroorm-for-autofeature/functions.ts @@ -0,0 +1,76 @@ +/** + * 根据传入的模块获取用于传入MikroOrmModule.forFeature的entities配置 + * @param modules + */ +export const resolveModuleEntities = ( + modules: ModuleMetadata["imports"] = [] +): MikroOrmModuleFeatureOptions[] => + modules + // 获取所有模块的entities选项,组成[{entities: [PostEntity], contextName: 'xxx'},{entities: [PostEntity], contextName: 'fff'}],[{entities: [UserEntity]}]这样的形式 + .map((m) => ("entities" in m && isFunction(m.entities) ? m.entities() : [])) + // 合并所有entities选项,形成一维数组用于传入MikroOrmModule,如[{entities: [PostEntity], contextName: 'xxx'},{entities: [PostEntity], contextName: 'fff'},{entities: [UserEntity]}] + .reduce((o, n) => [...o, ...n], []); + +/** + * 获取用于MikroOrm使用的entities配置 + * @param modules + */ +const resolveConfigEntities = ( + modules: ModuleMetadata["imports"] = [] +): EntityClass>[] => { + const moduleEntities = resolveModuleEntities(modules); + return ( + moduleEntities + .map(({ entities }) => entities) + // 把所有模块的entities合并到一个数组中 + .reduce((o, n) => [...o, ...n], []) + // 过滤去重相同的entity + .reduce((o, n) => [...o.filter((c) => c !== n), n], []) + ); +}; + +export type DatabaseModuleOptions = Omit< + MikroOrmModuleSyncOptions, + "entities" +> & { + modules?: ModuleMetadata["imports"]; +}; + +@Module({ + // imports: [MikroOrmModule.forFeature({ entities: [PostEntity] })], + controllers: [PostController], + providers: [PostService], + exports: [PostService], +}) +export class ContentModule { + static entities(): MikroOrmModuleFeatureOptions[] { + return [{ entities: [PostEntity] }]; + } +} + + +@Module({}) +export class DatabaseModule { + static async forRoot( + options: DatabaseModuleOptions = {} + ): Promise { + const entitiesImports = resolveModuleEntities(options.modules ?? []).map( + (es) => MikroOrmModule.forFeature(es) + ); + return { + global: true, + module: DatabaseModule, + imports: [ + ...entitiesImports, + MikroOrmModule.forRootAsync({ + useFactory: () => + omit( + getDbConfigOptions(options), + "entities" + ), + }), + ], + exports: [MikroOrmModule], + }; + } +} \ No newline at end of file