Просмотр исходного кода

Initialize OpenaiService after AttachmentService initialization

Shun Miyazawa 11 месяцев назад
Родитель
Сommit
4d82765ab3

+ 12 - 5
apps/app/src/features/openai/server/services/openai.ts

@@ -22,6 +22,7 @@ import VectorStoreFileRelationModel, {
   type VectorStoreFileRelation,
   prepareVectorStoreFileRelations,
 } from '~/features/openai/server/models/vector-store-file-relation';
+import type Crowi from '~/server/crowi';
 import type { PageDocument, PageModel } from '~/server/models/page';
 import UserGroupRelation from '~/server/models/user-group-relation';
 import { configManager } from '~/server/service/config-manager';
@@ -91,8 +92,9 @@ export interface IOpenaiService {
 }
 class OpenaiService implements IOpenaiService {
 
-  constructor() {
+  constructor(crowi: Crowi) {
     this.createVectorStoreFileOnUploadAttachment = this.createVectorStoreFileOnUploadAttachment.bind(this);
+    crowi.attachmentService.addAttachHandler(this.createVectorStoreFileOnUploadAttachment);
   }
 
   private get client() {
@@ -980,15 +982,20 @@ class OpenaiService implements IOpenaiService {
 }
 
 let instance: OpenaiService;
-export const getOpenaiService = (): IOpenaiService | undefined => {
-  if (instance != null) {
-    return instance;
+export const initializeOpenaiService = (crowi: Crowi): void => {
+  if (crowi == null) {
+    throw new Error('Crowi instance is required to initialize OpenaiService');
   }
 
   const aiEnabled = configManager.getConfig('app:aiEnabled');
   const openaiServiceType = configManager.getConfig('openai:serviceType');
   if (aiEnabled && openaiServiceType != null && OpenaiServiceTypes.includes(openaiServiceType)) {
-    instance = new OpenaiService();
+    instance = new OpenaiService(crowi);
+  }
+};
+
+export const getOpenaiService = (): IOpenaiService | undefined => {
+  if (instance != null) {
     return instance;
   }
 

+ 12 - 1
apps/app/src/server/crowi/index.js

@@ -11,6 +11,7 @@ import next from 'next';
 import { KeycloakUserGroupSyncService } from '~/features/external-user-group/server/service/keycloak-user-group-sync';
 import { LdapUserGroupSyncService } from '~/features/external-user-group/server/service/ldap-user-group-sync';
 import { startCronIfEnabled as startOpenaiCronIfEnabled } from '~/features/openai/server/services/cron';
+import { initializeOpenaiService } from '~/features/openai/server/services/openai';
 import { checkPageBulkExportJobInProgressCronService } from '~/features/page-bulk-export/server/service/check-page-bulk-export-job-in-progress-cron';
 import instanciatePageBulkExportJobCleanUpCronService, {
   pageBulkExportJobCleanUpCronService,
@@ -177,6 +178,13 @@ Crowi.prototype.init = async function() {
   this.models = await setupModelsDependentOnCrowi(this);
   await this.setupConfigManager();
   await this.setupSessionConfig();
+
+  this.setupAttachmentService();
+
+  // OpenaiService depends on AttachmentService
+  this.setupOpenaiService();
+
+  // OpenaiService (cron) depends on OpenaiService
   this.setupCron();
 
   // setup messaging services
@@ -200,7 +208,6 @@ Crowi.prototype.init = async function() {
     this.setupG2GTransferService(),
     this.setUpFileUpload(),
     this.setUpFileUploaderSwitchService(),
-    this.setupAttachmentService(),
     this.setUpAcl(),
     this.setUpRestQiitaAPI(),
     this.setupUserGroupService(),
@@ -809,4 +816,8 @@ Crowi.prototype.setupExternalUserGroupSyncService = function() {
   this.keycloakUserGroupSyncService = new KeycloakUserGroupSyncService(this.s2sMessagingService, this.socketIoService);
 };
 
+Crowi.prototype.setupOpenaiService = function() {
+  initializeOpenaiService(this);
+};
+
 export default Crowi;

+ 0 - 5
apps/app/src/server/routes/apiv3/attachment.js

@@ -4,7 +4,6 @@ import express from 'express';
 import multer from 'multer';
 import autoReap from 'multer-autoreap';
 
-import { getOpenaiService } from '~/features/openai/server/services/openai';
 import { SupportedAction } from '~/interfaces/activity';
 import { AttachmentType } from '~/server/interfaces/attachment';
 import { accessTokenParser } from '~/server/middlewares/access-token-parser';
@@ -361,10 +360,6 @@ module.exports = (crowi) => {
           return res.apiv3Err(`Forbidden to access to the page '${page.id}'`);
         }
 
-        // TODO: move later
-        const openaiService = getOpenaiService();
-        attachmentService.addAttachHandler(openaiService.createVectorStoreFileOnUploadAttachment);
-
         const attachment = await attachmentService.createAttachment(file, req.user, pageId, AttachmentType.WIKI_PAGE, autoReap(req, res, () => {}));
 
         const result = {

+ 0 - 3
apps/app/src/server/service/attachment.js

@@ -61,9 +61,6 @@ class AttachmentService {
     }
     finally {
       onAttached?.(file);
-
-      // TODO: move later
-      this.attachHandlers = [];
     }
 
     return attachment;