diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs index 44ceebf15..15f7e89e2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs @@ -13,7 +13,7 @@ public interface IConversationService Task> GetConversations(ConversationFilter filter); Task UpdateConversationTitle(string id, string title); Task UpdateConversationTitleAlias(string id, string titleAlias); - Task UpdateConversationTags(string conversationId, List tags); + Task UpdateConversationTags(string conversationId, List toAddTags, List toDeleteTags); Task UpdateConversationMessage(string conversationId, UpdateMessageRequest request); Task> GetLastConversations(); Task> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable excludeAgentIds); diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 9bccb82e4..332ca3405 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -132,7 +132,7 @@ void UpdateConversationTitle(string conversationId, string title) => throw new NotImplementedException(); void UpdateConversationTitleAlias(string conversationId, string titleAlias) => throw new NotImplementedException(); - bool UpdateConversationTags(string conversationId, List tags) + bool UpdateConversationTags(string conversationId, List toAddTags, List toDeleteTags) => throw new NotImplementedException(); bool AppendConversationTags(string conversationId, List tags) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index a1a0868a9..9fc97a72f 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -59,10 +59,10 @@ public async Task UpdateConversationTitleAlias(string id, string t return conversation; } - public async Task UpdateConversationTags(string conversationId, List tags) + public async Task UpdateConversationTags(string conversationId, List toAddTags, List toDeleteTags) { var db = _services.GetRequiredService(); - return db.UpdateConversationTags(conversationId, tags); + return db.UpdateConversationTags(conversationId, toAddTags, toDeleteTags); } public async Task UpdateConversationMessage(string conversationId, UpdateMessageRequest request) diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs index 3d70264c4..647282a48 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -158,7 +158,7 @@ public void UpdateConversationTitleAlias(string conversationId, string titleAlia } } - public bool UpdateConversationTags(string conversationId, List tags) + public bool UpdateConversationTags(string conversationId, List toAddTags, List toDeleteTags) { if (string.IsNullOrEmpty(conversationId)) return false; @@ -170,7 +170,11 @@ public bool UpdateConversationTags(string conversationId, List tags) var json = File.ReadAllText(convFile); var conv = JsonSerializer.Deserialize(json, _options); - conv.Tags = tags ?? new(); + + var tags = conv.Tags ?? []; + tags = tags.Concat(toAddTags).Distinct().ToList(); + conv.Tags = tags.Where(x => !toDeleteTags.Contains(x, StringComparer.OrdinalIgnoreCase)).ToList(); + conv.UpdatedTime = DateTime.UtcNow; File.WriteAllText(convFile, JsonSerializer.Serialize(conv, _options)); return true; diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 6cb42ac6d..f032f5045 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -255,7 +255,7 @@ public async Task UpdateConversationTitleAlias([FromRoute] string conversa public async Task UpdateConversationTags([FromRoute] string conversationId, [FromBody] UpdateConversationRequest request) { var conv = _services.GetRequiredService(); - return await conv.UpdateConversationTags(conversationId, request.Tags); + return await conv.UpdateConversationTags(conversationId, request.ToAddTags, request.ToDeleteTags); } [HttpPut("/conversation/{conversationId}/update-message")] diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/Request/UpdateConversationRequest.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/Request/UpdateConversationRequest.cs index c9b897471..c177221ce 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/Request/UpdateConversationRequest.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/Request/UpdateConversationRequest.cs @@ -2,5 +2,6 @@ namespace BotSharp.OpenAPI.ViewModels.Conversations; public class UpdateConversationRequest { - public List Tags { get; set; } = []; + public List ToAddTags { get; set; } = []; + public List ToDeleteTags { get; set; } = []; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index 908e66b5c..ebae075b8 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -134,13 +134,20 @@ public void UpdateConversationTitleAlias(string conversationId, string titleAlia _dc.Conversations.UpdateOne(filterConv, updateConv); } - public bool UpdateConversationTags(string conversationId, List tags) + public bool UpdateConversationTags(string conversationId, List toAddTags, List toDeleteTags) { if (string.IsNullOrEmpty(conversationId)) return false; var filter = Builders.Filter.Eq(x => x.Id, conversationId); + var conv = _dc.Conversations.Find(filter).FirstOrDefault(); + if (conv == null) return false; + + var tags = conv.Tags ?? []; + tags = tags.Concat(toAddTags).Distinct().ToList(); + tags = tags.Where(x => !toDeleteTags.Contains(x, StringComparer.OrdinalIgnoreCase)).ToList(); + var update = Builders.Update - .Set(x => x.Tags, tags ?? new()) + .Set(x => x.Tags, tags) .Set(x => x.UpdatedTime, DateTime.UtcNow); var res = _dc.Conversations.UpdateOne(filter, update);