Преглед изворни кода

Enable AiAssistant deletion when user is deleted

Shun Miyazawa пре 1 година
родитељ
комит
aa978baf18

+ 28 - 0
apps/app/src/features/openai/server/services/delete-ai-assistant-on-owner-deleted.ts

@@ -0,0 +1,28 @@
+import type { IUserHasId } from '^/../../packages/core/dist';
+
+import loggerFactory from '~/utils/logger';
+
+import AiAssistant from '../models/ai-assistant';
+
+import { getOpenaiService } from './openai';
+
+const logger = loggerFactory('growi:service:openai:delete-ai-assistant-on-owner-deleted');
+
+export const deleteAiAssistantOnOwnerDeleted = async(user: IUserHasId): Promise<void> => {
+  const openaiService = getOpenaiService();
+  if (openaiService != null) {
+    const aiAssistants = await AiAssistant.find({ owner: user });
+    for await (const aiAssistant of aiAssistants) {
+      try {
+        await openaiService.deleteAiAssistant(user._id, aiAssistant._id);
+      }
+      catch (err) {
+        logger.error(`Failed to delete AiAssistant ${aiAssistant._id}`);
+      }
+    }
+  }
+
+  // Cannot delete OpenAI VectorStore entities without enabling openaiService.
+  // Delete OpenAI VectorStore entities through deleteAiAssistantOnOwnerDeleted when app starts with openaiService enabled
+  await AiAssistant.deleteMany({ owner: user });
+};

+ 3 - 0
apps/app/src/server/routes/apiv3/users.js

@@ -9,6 +9,7 @@ import { body, query } from 'express-validator';
 import { isEmail } from 'validator';
 
 import ExternalUserGroupRelation from '~/features/external-user-group/server/models/external-user-group-relation';
+import { deleteAiAssistantOnOwnerDeleted } from '~/features/openai/server/services/delete-ai-assistant-on-owner-deleted';
 import { SupportedAction } from '~/interfaces/activity';
 import { accessTokenParser } from '~/server/middlewares/access-token-parser';
 import Activity from '~/server/models/activity';
@@ -809,6 +810,8 @@ module.exports = (crowi) => {
       await user.statusDelete();
       await ExternalAccount.remove({ user });
 
+      await deleteAiAssistantOnOwnerDeleted(user);
+
       const serializedUser = serializeUserSecurely(user);
 
       activityEvent.emit('update', res.locals.activity._id, { action: SupportedAction.ACTION_ADMIN_USERS_REMOVE });