From 4a219798d98a0bfd4bb9aef4e9468969e42be838 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 18 Sep 2023 18:14:24 -0500 Subject: [PATCH] sync agent structure changes --- .../Agents/Enums/AgentField.cs | 4 + .../Agents/Models/Agent.cs | 32 +++++++- .../Routing/Models/RoutingRule.cs | 5 ++ .../Services/AgentService.CreateAgent.cs | 4 + .../Services/AgentService.UpdateAgent.cs | 10 +++ .../ViewModels/Agents/AgentCreationModel.cs | 11 ++- .../ViewModels/Agents/AgentUpdateModel.cs | 19 +++++ .../Collections/AgentCollection.cs | 5 ++ .../Models/RoutingRuleElement.cs | 37 +++++++++ .../Repository/MongoRepository.cs | 79 +++++++++++++++++++ 10 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.MongoStorage/Models/RoutingRuleElement.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs index 5f56004a..d82e8602 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs @@ -6,6 +6,10 @@ public enum AgentField Name, Description, IsPublic, + Disabled, + AllowRouting, + Profiles, + RoutingRules, Instruction, Function, Template, diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs index 8b968035..d3551296 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs @@ -6,7 +6,7 @@ public class Agent { public string Id { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; - public string Description { get; set; } + public string Description { get; set; } = string.Empty; public DateTime CreatedDateTime { get; set; } public DateTime UpdatedDateTime { get; set; } @@ -81,6 +81,10 @@ public class Agent Samples = agent.Samples, Knowledges = agent.Knowledges, IsPublic = agent.IsPublic, + Disabled = agent.Disabled, + AllowRouting = agent.AllowRouting, + Profiles = agent.Profiles, + RoutingRules = agent.RoutingRules, CreatedDateTime = agent.CreatedDateTime, UpdatedDateTime = agent.UpdatedDateTime, }; @@ -94,7 +98,7 @@ public class Agent public Agent SetTemplates(List templates) { - Templates = templates; + Templates = templates ?? new List(); return this; } @@ -133,4 +137,28 @@ public class Agent IsPublic = isPublic; return this; } + + public Agent SetDisabled(bool disabled) + { + Disabled = disabled; + return this; + } + + public Agent SetAllowRouting(bool allowRouting) + { + AllowRouting = allowRouting; + return this; + } + + public Agent SetProfiles(List profiles) + { + Profiles = profiles ?? new List(); + return this; + } + + public Agent SetRoutingRules(List rules) + { + RoutingRules = rules ?? new List(); + return this; + } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutingRule.cs b/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutingRule.cs index 40102d4a..ca24ad6b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutingRule.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutingRule.cs @@ -18,4 +18,9 @@ public class RoutingRule { return $"{AgentName} {Field}"; } + + public RoutingRule() + { + + } } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs index 567a3dac..d42e1da0 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs @@ -35,6 +35,10 @@ public partial class AgentService .SetName(foundAgent.Name) .SetDescription(foundAgent.Description) .SetIsPublic(foundAgent.IsPublic) + .SetDisabled(foundAgent.Disabled) + .SetAllowRouting(foundAgent.AllowRouting) + .SetProfiles(foundAgent.Profiles) + .SetRoutingRules(foundAgent.RoutingRules) .SetInstruction(foundAgent.Instruction) .SetTemplates(foundAgent.Templates) .SetFunctions(foundAgent.Functions) diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs index 7f6b619b..f91fdef0 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Repositories; +using BotSharp.Abstraction.Routing.Models; using System.IO; namespace BotSharp.Core.Agents.Services; @@ -15,6 +16,11 @@ public partial class AgentService record.Name = agent.Name ?? string.Empty; record.Description = agent.Description ?? string.Empty; + record.IsPublic = agent.IsPublic; + record.Disabled = agent.Disabled; + record.AllowRouting = agent.AllowRouting; + record.Profiles = agent.Profiles ?? new List(); + record.RoutingRules = agent.RoutingRules ?? new List(); record.Instruction = agent.Instruction ?? string.Empty; record.Functions = agent.Functions ?? new List(); record.Templates = agent.Templates ?? new List(); @@ -53,6 +59,10 @@ public partial class AgentService .SetName(foundAgent.Name) .SetDescription(foundAgent.Description) .SetIsPublic(foundAgent.IsPublic) + .SetDisabled(foundAgent.Disabled) + .SetAllowRouting(foundAgent.AllowRouting) + .SetProfiles(foundAgent.Profiles) + .SetRoutingRules(foundAgent.RoutingRules) .SetInstruction(foundAgent.Instruction) .SetTemplates(foundAgent.Templates) .SetFunctions(foundAgent.Functions) diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs index a8e233fd..277f2d8a 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Agents.Models; +using BotSharp.Abstraction.Routing.Models; namespace BotSharp.OpenAPI.ViewModels.Agents; @@ -11,6 +12,10 @@ public class AgentCreationModel public List Functions { get; set; } public List Responses { get; set; } public bool IsPublic { get; set; } + public bool AllowRouting { get; set; } + public bool Disabled { get; set; } + public List Profiles { get; set; } + public List RoutingRules { get; set; } public Agent ToAgent() { @@ -22,7 +27,11 @@ public class AgentCreationModel Templates = Templates, Functions = Functions, Responses = Responses, - IsPublic = IsPublic + IsPublic = IsPublic, + AllowRouting = AllowRouting, + Disabled = Disabled, + Profiles = Profiles, + RoutingRules = RoutingRules }; } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs index 3052e5b6..bad6e861 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Agents.Models; +using BotSharp.Abstraction.Routing.Models; namespace BotSharp.OpenAPI.ViewModels.Agents; @@ -32,12 +33,30 @@ public class AgentUpdateModel /// public List? Responses { get; set; } + public bool IsPublic { get; set; } + + public bool AllowRouting { get; set; } + + public bool Disabled { get; set; } + + /// + /// Profile by channel + /// + public List Profiles { get; set; } + + public List RoutingRules { get; set; } + public Agent ToAgent() { var agent = new Agent() { Name = Name ?? string.Empty, Description = Description ?? string.Empty, + IsPublic = IsPublic, + Disabled = Disabled, + AllowRouting = AllowRouting, + Profiles = Profiles ?? new List(), + RoutingRules = RoutingRules ?? new List(), Instruction = Instruction ?? string.Empty, Templates = Templates ?? new List(), Functions = Functions ?? new List(), diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentCollection.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentCollection.cs index aa84af03..0f3d5ab8 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentCollection.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentCollection.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Agents.Models; +using BotSharp.Plugin.MongoStorage.Models; namespace BotSharp.Plugin.MongoStorage.Collections; @@ -11,6 +12,10 @@ public class AgentCollection : MongoBase public List Functions { get; set; } public List Responses { get; set; } public bool IsPublic { get; set; } + public bool AllowRouting { get; set; } + public bool Disabled { get; set; } + public List Profiles { get; set; } + public List RoutingRules { get; set; } public DateTime CreatedTime { get; set; } public DateTime UpdatedTime { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/RoutingRuleElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/RoutingRuleElement.cs new file mode 100644 index 00000000..bdb8e1be --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/RoutingRuleElement.cs @@ -0,0 +1,37 @@ +using BotSharp.Abstraction.Routing.Models; + +namespace BotSharp.Plugin.MongoStorage.Models; + +public class RoutingRuleElement +{ + public string Field { get; set; } + public bool Required { get; set; } + public Guid? RedirectTo { get; set; } + + public RoutingRuleElement() + { + + } + + public static RoutingRuleElement ToMongoElement(RoutingRule routingRule) + { + return new RoutingRuleElement + { + Field = routingRule.Field, + Required = routingRule.Required, + RedirectTo = !string.IsNullOrEmpty(routingRule.RedirectTo) ? Guid.Parse(routingRule.RedirectTo) : null + }; + } + + public static RoutingRule ToDomainElement(string agentId, string agentName, RoutingRuleElement rule) + { + return new RoutingRule + { + AgentId = agentId, + AgentName = agentName, + Field = rule.Field, + Required = rule.Required, + RedirectTo = rule.RedirectTo?.ToString() + }; + } +} diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs index 6f3ece02..d436b7b2 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs @@ -1,7 +1,9 @@ using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Conversations.Models; +using BotSharp.Abstraction.Routing.Models; using BotSharp.Abstraction.Users.Models; using BotSharp.Plugin.MongoStorage.Collections; +using BotSharp.Plugin.MongoStorage.Models; namespace BotSharp.Plugin.MongoStorage.Repository; @@ -42,6 +44,12 @@ public class MongoRepository : IBotSharpRepository Functions = x.Functions, Responses = x.Responses, IsPublic = x.IsPublic, + Disabled = x.Disabled, + AllowRouting = x.AllowRouting, + Profiles = x.Profiles, + RoutingRules = x.RoutingRules? + .Select(r => RoutingRuleElement.ToDomainElement(x.Id.ToString(), x.Name, r))? + .ToList() ?? new List(), CreatedDateTime = x.CreatedTime, UpdatedDateTime = x.UpdatedTime }).ToList(); @@ -206,6 +214,12 @@ public class MongoRepository : IBotSharpRepository Functions = x.Functions, Responses = x.Responses, IsPublic = x.IsPublic, + AllowRouting = x.AllowRouting, + Disabled = x.Disabled, + Profiles = x.Profiles, + RoutingRules = x.RoutingRules? + .Select(r => RoutingRuleElement.ToMongoElement(r))? + .ToList() ?? new List(), CreatedTime = x.CreatedDateTime, UpdatedTime = x.UpdatedDateTime }).ToList(); @@ -221,6 +235,10 @@ public class MongoRepository : IBotSharpRepository .Set(x => x.Functions, agent.Functions) .Set(x => x.Responses, agent.Responses) .Set(x => x.IsPublic, agent.IsPublic) + .Set(x => x.AllowRouting, agent.AllowRouting) + .Set(x => x.Disabled, agent.Disabled) + .Set(x => x.Profiles, agent.Profiles) + .Set(x => x.RoutingRules, agent.RoutingRules) .Set(x => x.CreatedTime, agent.CreatedTime) .Set(x => x.UpdatedTime, agent.UpdatedTime); _dc.Agents.UpdateOne(filter, update, _options); @@ -299,6 +317,18 @@ public class MongoRepository : IBotSharpRepository case AgentField.IsPublic: UpdateAgentIsPublic(agent.Id, agent.IsPublic); break; + case AgentField.Disabled: + UpdateAgentDisabled(agent.Id, agent.Disabled); + break; + case AgentField.AllowRouting: + UpdateAgentAllowRouting(agent.Id, agent.AllowRouting); + break; + case AgentField.Profiles: + UpdateAgentProfiles(agent.Id, agent.Profiles); + break; + case AgentField.RoutingRules: + UpdateAgentRoutingRules(agent.Id, agent.RoutingRules); + break; case AgentField.Instruction: UpdateAgentInstruction(agent.Id, agent.Instruction); break; @@ -354,6 +384,51 @@ public class MongoRepository : IBotSharpRepository _dc.Agents.UpdateOne(filter, update); } + private void UpdateAgentDisabled(string agentId, bool disabled) + { + var filter = Builders.Filter.Eq(x => x.Id, Guid.Parse(agentId)); + var update = Builders.Update + .Set(x => x.Disabled, disabled) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + + _dc.Agents.UpdateOne(filter, update); + } + + private void UpdateAgentAllowRouting(string agentId, bool allowRouting) + { + var filter = Builders.Filter.Eq(x => x.Id, Guid.Parse(agentId)); + var update = Builders.Update + .Set(x => x.AllowRouting, allowRouting) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + + _dc.Agents.UpdateOne(filter, update); + } + + private void UpdateAgentProfiles(string agentId, List profiles) + { + if (profiles.IsNullOrEmpty()) return; + + var filter = Builders.Filter.Eq(x => x.Id, Guid.Parse(agentId)); + var update = Builders.Update + .Set(x => x.Profiles, profiles) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + + _dc.Agents.UpdateOne(filter, update); + } + + private void UpdateAgentRoutingRules(string agentId, List rules) + { + if (rules.IsNullOrEmpty()) return; + + var ruleElements = rules.Select(x => RoutingRuleElement.ToMongoElement(x)).ToList(); + var filter = Builders.Filter.Eq(x => x.Id, Guid.Parse(agentId)); + var update = Builders.Update + .Set(x => x.RoutingRules, ruleElements) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + + _dc.Agents.UpdateOne(filter, update); + } + private void UpdateAgentInstruction(string agentId, string instruction) { if (string.IsNullOrEmpty(instruction)) return; @@ -408,6 +483,10 @@ public class MongoRepository : IBotSharpRepository var update = Builders.Update .Set(x => x.Name, agent.Name) .Set(x => x.Description, agent.Description) + .Set(x => x.Disabled, agent.Disabled) + .Set(x => x.AllowRouting, agent.AllowRouting) + .Set(x => x.Profiles, agent.Profiles) + .Set(x => x.RoutingRules, agent.RoutingRules.Select(x => RoutingRuleElement.ToMongoElement(x)).ToList()) .Set(x => x.Instruction, agent.Instruction) .Set(x => x.Templates, agent.Templates) .Set(x => x.Functions, agent.Functions)