Kaynağa Gözat

Refactor setDefaultAiAssistant

Shun Miyazawa 1 yıl önce
ebeveyn
işleme
a05fbb5fef

+ 1 - 19
apps/app/src/features/openai/server/models/ai-assistant.ts

@@ -1,5 +1,4 @@
 import { type IGrantedGroup, GroupType } from '@growi/core';
-import createError from 'http-errors';
 import { type Model, type Document, Schema } from 'mongoose';
 
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
@@ -8,9 +7,7 @@ import { type AiAssistant, AiAssistantShareScope, AiAssistantAccessScope } from
 
 export interface AiAssistantDocument extends AiAssistant, Document {}
 
-interface AiAssistantModel extends Model<AiAssistantDocument> {
-  setDefault(id: string, isDefault: boolean): Promise<AiAssistantDocument>;
-}
+type AiAssistantModel = Model<AiAssistantDocument>;
 
 /*
  * Schema Definition
@@ -111,19 +108,4 @@ const schema = new Schema<AiAssistantDocument>(
 );
 
 
-schema.statics.setDefault = async function(id: string, isDefault: boolean): Promise<AiAssistantDocument> {
-  const aiAssistant = await this.findOne({ _id: id, shareScope: AiAssistantAccessScope.PUBLIC_ONLY });
-  if (aiAssistant == null) {
-    throw createError(404, 'AiAssistant document does not exist');
-  }
-
-  await this.updateMany({ isDefault: true }, { isDefault: false });
-
-  aiAssistant.isDefault = isDefault;
-  const updatedAiAssistant = await aiAssistant.save();
-
-  return updatedAiAssistant;
-};
-
-
 export default getOrCreateModel<AiAssistantDocument, AiAssistantModel>('AiAssistant', schema);

+ 8 - 1
apps/app/src/features/openai/server/routes/set-default-ai-assistant.ts

@@ -9,8 +9,10 @@ import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
 import loggerFactory from '~/utils/logger';
 
+import { AiAssistantAccessScope } from '../../interfaces/ai-assistant';
 import AiAssistantModel from '../models/ai-assistant';
 import { getOpenaiService } from '../services/openai';
+import { setDefaultAiAssistant } from '../services/set-default-ai-assistant';
 
 import { certifyAiService } from './middlewares/certify-ai-service';
 
@@ -49,7 +51,12 @@ export const setDefaultAiAssistantFactory: setDefaultAiAssistantFactory = (crowi
         const { id } = req.params;
         const { isDefault } = req.body;
 
-        const updatedAiAssistant = await AiAssistantModel.setDefault(id, isDefault);
+        const aiAssistant = await AiAssistantModel.findOne({ _id: id, shareScope: AiAssistantAccessScope.PUBLIC_ONLY });
+        if (aiAssistant == null) {
+          return res.apiv3Err(new ErrorV3('The AiAssistant does not exist or is not public'), 404);
+        }
+
+        const updatedAiAssistant = await setDefaultAiAssistant(id, isDefault);
         return res.apiv3({ updatedAiAssistant });
       }
       catch (err) {

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

@@ -42,6 +42,7 @@ import { generateGlobPatterns } from '../utils/generate-glob-patterns';
 import { getClient } from './client-delegator';
 import { openaiApiErrorHandler } from './openai-api-error-handler';
 import { replaceAnnotationWithPageLink } from './replace-annotation-with-page-link';
+import { setDefaultAiAssistant } from './set-default-ai-assistant';
 
 const { isDeepEquals } = deepEquals;
 
@@ -829,17 +830,17 @@ class OpenaiService implements IOpenaiService {
       this.createVectorStoreFileWithStream(newVectorStoreRelation, conditions);
     }
 
-    if (data.shareScope !== AiAssistantShareScope.PUBLIC_ONLY && aiAssistant.isDefault) {
-      await AiAssistantModel.setDefault(aiAssistant._id, false);
-    }
-
     const newData = {
       ...data,
       vectorStore: newVectorStoreRelation ?? aiAssistant.vectorStore,
     };
 
     aiAssistant.set({ ...newData });
-    const updatedAiAssistant = await aiAssistant.save();
+
+    let updatedAiAssistant: AiAssistantDocument = await aiAssistant.save();
+    if (data.shareScope !== AiAssistantShareScope.PUBLIC_ONLY && aiAssistant.isDefault) {
+      updatedAiAssistant = await setDefaultAiAssistant(aiAssistant._id, false);
+    }
 
     return updatedAiAssistant;
   }

+ 18 - 0
apps/app/src/features/openai/server/services/set-default-ai-assistant.ts

@@ -0,0 +1,18 @@
+import createError from 'http-errors';
+
+import AiAssistantModel, { type AiAssistantDocument } from '../models/ai-assistant';
+
+
+export const setDefaultAiAssistant = async(id: string, isDefault: boolean): Promise<AiAssistantDocument> => {
+  const aiAssistant = await AiAssistantModel.findById(id);
+  if (aiAssistant == null) {
+    throw createError(404, 'AiAssistant document does not exist');
+  }
+
+  await AiAssistantModel.updateMany({ isDefault: true }, { isDefault: false });
+
+  aiAssistant.isDefault = isDefault;
+  const updatedAiAssistant = await aiAssistant.save();
+
+  return updatedAiAssistant;
+};