diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs index f752633b..48a19fa6 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs @@ -7,6 +7,7 @@ public class ConversationFilter /// Conversation Id /// public string? Id { get; set; } + public string? Title { get; set; } public string? AgentId { get; set; } public string? Status { get; set; } public string? Channel { get; set; } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs index 5ccd3777..e4bb5098 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -293,6 +293,10 @@ namespace BotSharp.Core.Repository { matched = matched && record.Id == filter.Id; } + if (filter?.Title != null) + { + matched = matched && record.Title.Contains(filter.Title); + } if (filter?.AgentId != null) { matched = matched && record.AgentId == filter.AgentId; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index 59fe4dad..e3f95f27 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -1,9 +1,5 @@ -using Amazon.Util.Internal; using BotSharp.Abstraction.Conversations.Models; using BotSharp.Abstraction.Repositories.Filters; -using MongoDB.Bson.Serialization; -using MongoDB.Driver; -using System.Collections.Immutable; namespace BotSharp.Plugin.MongoStorage.Repository; @@ -66,7 +62,7 @@ public partial class MongoRepository var statesDeleted = _dc.ConversationStates.DeleteMany(filterSates); var dialogDeleted = _dc.ConversationDialogs.DeleteMany(filterDialog); var convDeleted = _dc.Conversations.DeleteMany(filterConv); - + return convDeleted.DeletedCount > 0 || dialogDeleted.DeletedCount > 0 || statesDeleted.DeletedCount > 0 || exeLogDeleted.DeletedCount > 0 || promptLogDeleted.DeletedCount > 0 || contentLogDeleted.DeletedCount > 0 || stateLogDeleted.DeletedCount > 0; @@ -237,6 +233,10 @@ public partial class MongoRepository { convFilters.Add(convBuilder.Eq(x => x.Id, filter.Id)); } + if (!string.IsNullOrEmpty(filter?.Title)) + { + convFilters.Add(convBuilder.Regex(x => x.Title, new BsonRegularExpression(filter.Title, "i"))); + } if (!string.IsNullOrEmpty(filter?.AgentId)) { convFilters.Add(convBuilder.Eq(x => x.AgentId, filter.AgentId)); @@ -380,7 +380,7 @@ public partial class MongoRepository { break; } - + conversationIds = conversationIds.Concat(candidates).Distinct().ToList(); if (conversationIds.Count >= batchSize) { @@ -419,7 +419,7 @@ public partial class MongoRepository // Handle truncated dialogs var truncatedDialogs = foundDialog.Dialogs.Where((x, idx) => idx < foundIdx).ToList(); - + // Handle truncated states var refTime = foundDialog.Dialogs.ElementAt(foundIdx).MetaData.CreateTime; var stateFilter = Builders.Filter.Eq(x => x.ConversationId, conversationId); @@ -457,7 +457,7 @@ public partial class MongoRepository var truncatedBreakpoints = breakpoints.Where(x => x.CreatedTime < refTime).ToList(); foundStates.Breakpoints = truncatedBreakpoints; } - + // Update _dc.ConversationStates.ReplaceOne(stateFilter, foundStates); } @@ -492,7 +492,7 @@ public partial class MongoRepository _dc.ContentLogs.DeleteMany(contentLogBuilder.And(contentLogFilters)); _dc.StateLogs.DeleteMany(stateLogBuilder.And(stateLogFilters)); } - + return deletedMessageIds; }