Yuki Takei 1 год назад
Родитель
Сommit
07ef2d9e33

+ 3 - 3
apps/app/src/server/crowi/index.js

@@ -39,7 +39,7 @@ import { UserNotificationService } from '../service/user-notification';
 import { initializeYjsService } from '../service/yjs';
 import { getModelSafely, getMongoUri, mongoOptions } from '../util/mongoose-utils';
 
-import { setupModels } from './setup-models';
+import { setupModelsDependentOnCrowi } from './setup-models';
 
 
 const logger = loggerFactory('growi:crowi');
@@ -101,7 +101,7 @@ class Crowi {
 
     this.tokens = null;
 
-    /** @type {{ [modelName: string]: mongoose.Model }} */
+    /** @type {import('./setup-models').ModelsMapDependentOnCrowi} */
     this.models = {};
 
     this.env = process.env;
@@ -123,7 +123,7 @@ class Crowi {
 
 Crowi.prototype.init = async function() {
   await this.setupDatabase();
-  this.models = setupModels(this);
+  this.models = await setupModelsDependentOnCrowi(this);
   await this.setupConfigManager();
   await this.setupSessionConfig();
   this.setupCron();

+ 49 - 5
apps/app/src/server/crowi/setup-models.ts

@@ -2,19 +2,27 @@ import type { Model } from 'mongoose';
 
 import loggerFactory from '~/utils/logger';
 
-import { modelsDependsOnCrowi } from '../models';
-
 import type Crowi from '.';
 
 const logger = loggerFactory('growi:crowi:setup-models');
 
-type ModelsMap = {
+export type ModelsMapDependentOnCrowi = {
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
   [modelName: string]: Model<any>,
 }
 
-export const setupModels = (crowi: Crowi): ModelsMap => {
-  const modelsMap: ModelsMap = {};
+export const setupModelsDependentOnCrowi = async(crowi: Crowi): Promise<ModelsMapDependentOnCrowi> => {
+  const modelsMap: ModelsMapDependentOnCrowi = {};
+
+  const modelsDependsOnCrowi = {
+    Page: (await import('../models/page')).default,
+    User: (await import('../models/user')).default,
+    Bookmark: (await import('../models/bookmark')).default,
+    GlobalNotificationSetting: (await import('../models/GlobalNotificationSetting')).default,
+    GlobalNotificationMailSetting: (await import('../models/GlobalNotificationSetting/GlobalNotificationMailSetting')).default,
+    GlobalNotificationSlackSetting: (await import('../models/GlobalNotificationSetting/GlobalNotificationSlackSetting')).default,
+    SlackAppIntegration: (await import('../models/slack-app-integration')).default,
+  };
 
   Object.keys(modelsDependsOnCrowi).forEach((modelName) => {
     const factory = modelsDependsOnCrowi[modelName];
@@ -29,3 +37,39 @@ export const setupModels = (crowi: Crowi): ModelsMap => {
 
   return modelsMap;
 };
+
+export const setupIndependentModels = async(): Promise<void> => {
+  await Promise.all([
+    import('~/features/comment/server/models'),
+    import('~/features/external-user-group/server/models/external-user-group-relation'),
+    import('~/features/external-user-group/server/models/external-user-group'),
+    import('~/features/growi-plugin/server/models'),
+    import('~/features/questionnaire/server/models/proactive-questionnaire-answer'),
+    import('~/features/questionnaire/server/models/questionnaire-answer-status'),
+    import('~/features/questionnaire/server/models/questionnaire-answer'),
+    import('~/features/questionnaire/server/models/questionnaire-order'),
+    import('../models/activity'),
+    import('../models/attachment'),
+    import('../models/bookmark-folder'),
+    import('../models/config'),
+    import('../models/editor-settings'),
+    import('../models/external-account'),
+    import('../models/in-app-notification-settings'),
+    import('../models/in-app-notification'),
+    import('../models/named-query'),
+    import('../models/page-operation'),
+    import('../models/page-redirect'),
+    import('../models/page-tag-relation'),
+    import('../models/password-reset-order'),
+    import('../models/revision'),
+    import('../models/share-link'),
+    import('../models/subscription'),
+    import('../models/tag'),
+    import('../models/transfer-key'),
+    import('../models/update-post'),
+    import('../models/user-group-relation'),
+    import('../models/user-group'),
+    import('../models/user-registration-order'),
+    import('../models/user-ui-settings'),
+  ]);
+};

+ 0 - 27
apps/app/src/server/models/index.ts

@@ -1,27 +0,0 @@
-import GlobalNotificationSetting from './GlobalNotificationSetting';
-import GlobalNotificationMailSetting from './GlobalNotificationSetting/GlobalNotificationMailSetting';
-import GlobalNotificationSlackSetting from './GlobalNotificationSetting/GlobalNotificationSlackSetting';
-import Bookmark from './bookmark';
-import Page from './page';
-import SlackAppIntegration from './slack-app-integration';
-import User from './user';
-
-export const modelsDependsOnCrowi = {
-  Page,
-  User,
-  Bookmark,
-  GlobalNotificationSetting,
-  GlobalNotificationMailSetting,
-  GlobalNotificationSlackSetting,
-  SlackAppIntegration,
-};
-
-// setup models that independent from crowi
-export * from './attachment';
-export * as Activity from './activity';
-export * as PageRedirect from './page-redirect';
-export * from './revision';
-export * as ShareLink from './share-link';
-export * as Tag from './tag';
-export * as UserGroup from './user-group';
-export * as PageTagRelation from './page-tag-relation';

+ 4 - 3
apps/app/src/server/service/import/construct-convert-map.integ.ts

@@ -3,7 +3,7 @@ import type { EventEmitter } from 'events';
 import { mock } from 'vitest-mock-extended';
 
 import type Crowi from '~/server/crowi';
-import { setupModels } from '~/server/crowi/setup-models';
+import { setupIndependentModels, setupModelsDependentOnCrowi } from '~/server/crowi/setup-models';
 
 import { constructConvertMap } from './construct-convert-map';
 
@@ -18,7 +18,8 @@ describe('constructConvertMap', () => {
       event: (name: string) => events[name],
     });
 
-    setupModels(crowiMock);
+    await setupModelsDependentOnCrowi(crowiMock);
+    await setupIndependentModels();
   });
 
   test('should return convert map', () => {
@@ -29,6 +30,6 @@ describe('constructConvertMap', () => {
 
     // assert
     expect(result).not.toBeNull();
-    expect(Object.keys(result).length).toEqual(17);
+    expect(Object.keys(result).length).toEqual(36);
   });
 });