Jelajahi Sumber

Merge pull request #10100 from weseek/feat/167709-exclude-threads-of-deleted-assistants-from-get-openai-threads-recent-response

feat: Exclude threads of deleted assistants from GET: /openai/threads/recent response
Yuki Takei 9 bulan lalu
induk
melakukan
100dbb726d

+ 1 - 0
apps/app/src/features/openai/interfaces/thread-relation.ts

@@ -17,6 +17,7 @@ export interface IThreadRelation {
   title?: string;
   title?: string;
   type: ThreadType;
   type: ThreadType;
   expiredAt: Date;
   expiredAt: Date;
+  isActive: boolean;
 }
 }
 
 
 export type IThreadRelationHasId = IThreadRelation & HasObjectId;
 export type IThreadRelationHasId = IThreadRelation & HasObjectId;

+ 19 - 0
apps/app/src/features/openai/server/models/thread-relation.ts

@@ -19,6 +19,7 @@ export interface ThreadRelationDocument extends IThreadRelation, Document {
 
 
 interface ThreadRelationModel extends PaginateModel<ThreadRelationDocument> {
 interface ThreadRelationModel extends PaginateModel<ThreadRelationDocument> {
   getExpiredThreadRelations(limit?: number): Promise<ThreadRelationDocument[] | undefined>;
   getExpiredThreadRelations(limit?: number): Promise<ThreadRelationDocument[] | undefined>;
+  deactivateByAiAssistantId(aiAssistantId: string): Promise<void>;
 }
 }
 
 
 const schema = new Schema<ThreadRelationDocument, ThreadRelationModel>({
 const schema = new Schema<ThreadRelationDocument, ThreadRelationModel>({
@@ -49,6 +50,11 @@ const schema = new Schema<ThreadRelationDocument, ThreadRelationModel>({
     default: generateExpirationDate,
     default: generateExpirationDate,
     required: true,
     required: true,
   },
   },
+  isActive: {
+    type: Boolean,
+    default: true,
+    required: true,
+  },
 }, {
 }, {
   timestamps: { createdAt: false, updatedAt: true },
   timestamps: { createdAt: false, updatedAt: true },
 });
 });
@@ -61,6 +67,19 @@ schema.statics.getExpiredThreadRelations = async function(limit?: number): Promi
   return expiredThreadRelations;
   return expiredThreadRelations;
 };
 };
 
 
+schema.statics.deactivateByAiAssistantId = async function(aiAssistantId: string): Promise<void> {
+  await this.updateMany(
+    {
+      aiAssistant: aiAssistantId,
+      isActive: true,
+    },
+    {
+      $set: { isActive: false },
+    },
+  );
+};
+
+
 schema.methods.updateThreadExpiration = async function(): Promise<void> {
 schema.methods.updateThreadExpiration = async function(): Promise<void> {
   this.expiredAt = generateExpirationDate();
   this.expiredAt = generateExpirationDate();
   await this.save();
   await this.save();

+ 4 - 1
apps/app/src/features/openai/server/routes/get-recent-threads.ts

@@ -49,7 +49,10 @@ export const getRecentThreadsFactory: GetRecentThreadsFactory = (crowi) => {
 
 
       try {
       try {
         const paginateResult: PaginateResult<ThreadRelationDocument> = await ThreadRelationModel.paginate(
         const paginateResult: PaginateResult<ThreadRelationDocument> = await ThreadRelationModel.paginate(
-          { userId: req.user._id },
+          {
+            isActive: true,
+            userId: req.user._id,
+          },
           {
           {
             page: req.query.page ?? 1,
             page: req.query.page ?? 1,
             limit: req.query.limit ?? 10,
             limit: req.query.limit ?? 10,

+ 2 - 0
apps/app/src/features/openai/server/services/delete-ai-assistant.ts

@@ -7,6 +7,7 @@ import loggerFactory from '~/utils/logger';
 
 
 import type { AiAssistantDocument } from '../models/ai-assistant';
 import type { AiAssistantDocument } from '../models/ai-assistant';
 import AiAssistantModel from '../models/ai-assistant';
 import AiAssistantModel from '../models/ai-assistant';
+import ThreadRelationModel from '../models/thread-relation';
 
 
 import { isAiEnabled } from './is-ai-enabled';
 import { isAiEnabled } from './is-ai-enabled';
 import { getOpenaiService } from './openai';
 import { getOpenaiService } from './openai';
@@ -27,6 +28,7 @@ export const deleteAiAssistant = async(ownerId: string, aiAssistantId: string):
 
 
   const vectorStoreRelationId = getIdStringForRef(aiAssistant.vectorStore);
   const vectorStoreRelationId = getIdStringForRef(aiAssistant.vectorStore);
   await openaiService.deleteVectorStore(vectorStoreRelationId);
   await openaiService.deleteVectorStore(vectorStoreRelationId);
+  await ThreadRelationModel.deactivateByAiAssistantId(aiAssistant._id);
 
 
   const deletedAiAssistant = await aiAssistant.remove();
   const deletedAiAssistant = await aiAssistant.remove();
   return deletedAiAssistant;
   return deletedAiAssistant;