diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.AgentTask.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.AgentTask.cs index 66e60649..d04855a3 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.AgentTask.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.AgentTask.cs @@ -95,9 +95,7 @@ public partial class FileRepository UpdatedDateTime = DateTime.UtcNow }; - var prefix = "#metadata"; - var postfix = "/metadata"; - var fileContent = $"{prefix}\n{JsonSerializer.Serialize(model, _options)}\n{postfix}\n\n{task.Content}"; + var fileContent = $"{AGENT_TASK_PREFIX}\n{JsonSerializer.Serialize(model, _options)}\n{AGENT_TASK_SUFFIX}\n\n{task.Content}"; File.WriteAllText(taskFile, fileContent); } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs index 7273acb7..13e19e54 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs @@ -33,6 +33,8 @@ public partial class FileRepository : IBotSharpRepository private const string STATE_FILE = "state.json"; private const string EXECUTION_LOG_FILE = "execution.log"; private const string PLUGIN_CONFIG_FILE = "config.json"; + private const string AGENT_TASK_PREFIX = "#metadata"; + private const string AGENT_TASK_SUFFIX = "/metadata"; public FileRepository( IServiceProvider services, @@ -293,7 +295,8 @@ public partial class FileRepository : IBotSharpRepository var fileName = taskFile.Split(Path.DirectorySeparatorChar).Last(); var id = fileName.Split('.').First(); var data = File.ReadAllText(taskFile); - var metaData = Regex.Match(data, @"#metadata.+/metadata", RegexOptions.Singleline); + var pattern = $@"{AGENT_TASK_PREFIX}.+{AGENT_TASK_SUFFIX}"; + var metaData = Regex.Match(data, pattern, RegexOptions.Singleline); if (!metaData.Success) return null; @@ -301,8 +304,9 @@ public partial class FileRepository : IBotSharpRepository if (task == null) return null; task.Id = id; - var content = Regex.Match(data, @"/metadata.+", RegexOptions.Singleline).Value; - task.Content = content.Substring(9).Trim(); + pattern = $@"{AGENT_TASK_SUFFIX}.+"; + var content = Regex.Match(data, pattern, RegexOptions.Singleline).Value; + task.Content = content.Substring(AGENT_TASK_SUFFIX.Length).Trim(); return task; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs index dd4f80e4..b974f681 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs @@ -335,100 +335,6 @@ public partial class MongoRepository return agent.Templates?.FirstOrDefault(x => x.Name == templateName.ToLower())?.Content ?? string.Empty; } - - #region Task - public PagedItems GetAgentTasks(AgentTaskFilter filter) - { - var pager = filter.Pager ?? new Pagination(); - var builder = Builders.Filter; - var filters = new List>() { builder.Empty }; - - if (!string.IsNullOrEmpty(filter.AgentId)) - { - filters.Add(builder.Eq(x => x.AgentId, filter.AgentId)); - } - - var filterDef = builder.And(filters); - var sortDef = Builders.Sort.Descending(x => x.CreatedTime); - var totalTasks = _dc.AgentTasks.CountDocuments(filterDef); - var taskDocs = _dc.AgentTasks.Find(filterDef).Sort(sortDef).Skip(pager.Offset).Limit(pager.Size).ToList(); - - var agentIds = taskDocs.Select(x => x.AgentId).Distinct().ToList(); - var agents = GetAgents(new AgentFilter { AgentIds = agentIds }); - - var tasks = taskDocs.Select(x => new AgentTask - { - Id = x.Id, - Name = x.Name, - Description = x.Description, - Enabled = x.Enabled, - AgentId = x.AgentId, - Content = x.Content, - CreatedDateTime = x.CreatedTime, - UpdatedDateTime = x.UpdatedTime, - Agent = agents.FirstOrDefault(a => a.Id == x.AgentId) - }).ToList(); - - return new PagedItems - { - Items = tasks, - Count = (int)totalTasks - }; - } - - public AgentTask? GetAgentTask(string agentId, string taskId) - { - if (string.IsNullOrEmpty(taskId)) return null; - - var taskDoc = _dc.AgentTasks.AsQueryable().FirstOrDefault(x => x.Id == taskId); - if (taskDoc == null) return null; - - var agentDoc = _dc.Agents.AsQueryable().FirstOrDefault(x => x.Id == taskDoc.AgentId); - var agent = TransformAgentDocument(agentDoc); - - var task = new AgentTask - { - Id = taskDoc.Id, - Name = taskDoc.Name, - Description = taskDoc.Description, - Enabled = taskDoc.Enabled, - AgentId = taskDoc.AgentId, - Content = taskDoc.Content, - CreatedDateTime = taskDoc.CreatedTime, - UpdatedDateTime = taskDoc.UpdatedTime, - Agent = agent - }; - - return task; - } - - public void InsertAgentTask(AgentTask task) - { - var taskDoc = new AgentTaskDocument - { - Id = Guid.NewGuid().ToString(), - Name = task.Name, - Description = task.Description, - Enabled = task.Enabled, - AgentId = task.AgentId, - Content = task.Content, - CreatedTime = DateTime.UtcNow, - UpdatedTime = DateTime.UtcNow - }; - - _dc.AgentTasks.InsertOne(taskDoc); - } - - public bool DeleteAgentTask(string agentId, string taskId) - { - if (string.IsNullOrEmpty(taskId)) return false; - - var filter = Builders.Filter.Eq(x => x.Id, taskId); - var taskDeleted = _dc.AgentTasks.DeleteOne(filter); - return taskDeleted.DeletedCount > 0; - } - #endregion - public void BulkInsertAgents(List agents) { if (agents.IsNullOrEmpty()) return; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.AgentTask.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.AgentTask.cs new file mode 100644 index 00000000..6f3b6d94 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.AgentTask.cs @@ -0,0 +1,101 @@ +using BotSharp.Abstraction.Repositories.Filters; +using BotSharp.Abstraction.Tasks.Models; +using BotSharp.Plugin.MongoStorage.Collections; + +namespace BotSharp.Plugin.MongoStorage.Repository; + +public partial class MongoRepository +{ + #region Task + public PagedItems GetAgentTasks(AgentTaskFilter filter) + { + var pager = filter.Pager ?? new Pagination(); + var builder = Builders.Filter; + var filters = new List>() { builder.Empty }; + + if (!string.IsNullOrEmpty(filter.AgentId)) + { + filters.Add(builder.Eq(x => x.AgentId, filter.AgentId)); + } + + var filterDef = builder.And(filters); + var sortDef = Builders.Sort.Descending(x => x.CreatedTime); + var totalTasks = _dc.AgentTasks.CountDocuments(filterDef); + var taskDocs = _dc.AgentTasks.Find(filterDef).Sort(sortDef).Skip(pager.Offset).Limit(pager.Size).ToList(); + + var agentIds = taskDocs.Select(x => x.AgentId).Distinct().ToList(); + var agents = GetAgents(new AgentFilter { AgentIds = agentIds }); + + var tasks = taskDocs.Select(x => new AgentTask + { + Id = x.Id, + Name = x.Name, + Description = x.Description, + Enabled = x.Enabled, + AgentId = x.AgentId, + Content = x.Content, + CreatedDateTime = x.CreatedTime, + UpdatedDateTime = x.UpdatedTime, + Agent = agents.FirstOrDefault(a => a.Id == x.AgentId) + }).ToList(); + + return new PagedItems + { + Items = tasks, + Count = (int)totalTasks + }; + } + + public AgentTask? GetAgentTask(string agentId, string taskId) + { + if (string.IsNullOrEmpty(taskId)) return null; + + var taskDoc = _dc.AgentTasks.AsQueryable().FirstOrDefault(x => x.Id == taskId); + if (taskDoc == null) return null; + + var agentDoc = _dc.Agents.AsQueryable().FirstOrDefault(x => x.Id == taskDoc.AgentId); + var agent = TransformAgentDocument(agentDoc); + + var task = new AgentTask + { + Id = taskDoc.Id, + Name = taskDoc.Name, + Description = taskDoc.Description, + Enabled = taskDoc.Enabled, + AgentId = taskDoc.AgentId, + Content = taskDoc.Content, + CreatedDateTime = taskDoc.CreatedTime, + UpdatedDateTime = taskDoc.UpdatedTime, + Agent = agent + }; + + return task; + } + + public void InsertAgentTask(AgentTask task) + { + var taskDoc = new AgentTaskDocument + { + Id = Guid.NewGuid().ToString(), + Name = task.Name, + Description = task.Description, + Enabled = task.Enabled, + AgentId = task.AgentId, + Content = task.Content, + CreatedTime = DateTime.UtcNow, + UpdatedTime = DateTime.UtcNow + }; + + _dc.AgentTasks.InsertOne(taskDoc); + } + + public bool DeleteAgentTask(string agentId, string taskId) + { + if (string.IsNullOrEmpty(taskId)) return false; + + var filter = Builders.Filter.Eq(x => x.Id, taskId); + var taskDeleted = _dc.AgentTasks.DeleteOne(filter); + return taskDeleted.DeletedCount > 0; + } + #endregion +}