Skip to content

Commit 08620ab

Browse files
authored
Merge pull request #290 from iceljc/features/migrate-agent-task-mongo
add task migration
2 parents c45b01a + fbc2760 commit 08620ab

File tree

6 files changed

+137
-13
lines changed

6 files changed

+137
-13
lines changed

src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ public interface IBotSharpRepository
3939
PagedItems<AgentTask> GetAgentTasks(AgentTaskFilter filter);
4040
AgentTask? GetAgentTask(string agentId, string taskId);
4141
void InsertAgentTask(AgentTask task);
42+
void BulkInsertAgentTasks(List<AgentTask> tasks);
4243
void UpdateAgentTask(AgentTask task, AgentTaskField field);
4344
bool DeleteAgentTask(string agentId, string taskId);
45+
bool DeleteAgentTasks();
4446
#endregion
4547

4648
#region Conversation

src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using BotSharp.Abstraction.Agents.Models;
22
using BotSharp.Abstraction.Functions.Models;
33
using BotSharp.Abstraction.Repositories;
4+
using BotSharp.Abstraction.Tasks.Models;
5+
using BotSharp.Abstraction.Users.Models;
46
using System.IO;
7+
using System.Text.RegularExpressions;
58

69
namespace BotSharp.Core.Agents.Services;
710

@@ -156,4 +159,71 @@ private List<string> FetchSamplesFromFile(string fileDir)
156159
var samples = File.ReadAllLines(file);
157160
return samples?.ToList() ?? new List<string>();
158161
}
162+
163+
private List<AgentTask> FetchTasksFromFile(string fileDir)
164+
{
165+
var tasks = new List<AgentTask>();
166+
var taskDir = Path.Combine(fileDir, "tasks");
167+
if (!Directory.Exists(taskDir)) return tasks;
168+
169+
var agentId = fileDir.Split(Path.DirectorySeparatorChar).Last();
170+
foreach (var file in Directory.GetFiles(taskDir))
171+
{
172+
var parsedTask = ParseAgentTask(file);
173+
if (parsedTask == null) continue;
174+
175+
var task = new AgentTask
176+
{
177+
Id = parsedTask.Id,
178+
Name = parsedTask.Name,
179+
Description = parsedTask.Description,
180+
Enabled = parsedTask.Enabled,
181+
DirectAgentId = parsedTask.DirectAgentId,
182+
Content = parsedTask.Content,
183+
AgentId = agentId,
184+
CreatedDateTime = parsedTask.CreatedDateTime,
185+
UpdatedDateTime = parsedTask.UpdatedDateTime
186+
};
187+
tasks.Add(task);
188+
}
189+
190+
return tasks;
191+
}
192+
193+
private AgentTask? ParseAgentTask(string taskFile)
194+
{
195+
if (string.IsNullOrWhiteSpace(taskFile)) return null;
196+
197+
var prefix = @"#metadata";
198+
var suffix = @"/metadata";
199+
var fileName = taskFile.Split(Path.DirectorySeparatorChar).Last();
200+
var id = fileName.Split('.').First();
201+
var data = File.ReadAllText(taskFile);
202+
var pattern = $@"{prefix}.+{suffix}";
203+
var metaData = Regex.Match(data, pattern, RegexOptions.Singleline);
204+
205+
if (!metaData.Success) return null;
206+
207+
var task = metaData.Value.JsonContent<AgentTask>();
208+
if (task == null) return null;
209+
210+
task.Id = id;
211+
pattern = $@"{suffix}.+";
212+
var content = Regex.Match(data, pattern, RegexOptions.Singleline).Value;
213+
task.Content = content.Substring(suffix.Length).Trim();
214+
return task;
215+
}
216+
217+
private UserAgent BuildUserAgent(string agentId, string userId, bool editable = false)
218+
{
219+
return new UserAgent
220+
{
221+
Id = Guid.NewGuid().ToString(),
222+
UserId = userId,
223+
AgentId = agentId,
224+
Editable = editable,
225+
CreatedTime = DateTime.UtcNow,
226+
UpdatedTime = DateTime.UtcNow
227+
};
228+
}
159229
}

src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.RefreshAgents.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using BotSharp.Abstraction.Agents.Models;
22
using BotSharp.Abstraction.Repositories;
3+
using BotSharp.Abstraction.Tasks.Models;
34
using Microsoft.Extensions.Caching.Memory;
5+
using System.Collections.Generic;
46
using System.IO;
57

68
namespace BotSharp.Core.Agents.Services;
@@ -9,8 +11,9 @@ public partial class AgentService
911
{
1012
public async Task RefreshAgents()
1113
{
12-
var isDeleted = _db.DeleteAgents();
13-
if (!isDeleted) return;
14+
var isAgentDeleted = _db.DeleteAgents();
15+
var isTaskDeleted = _db.DeleteAgentTasks();
16+
if (!isAgentDeleted) return;
1417

1518
var dbSettings = _services.GetRequiredService<BotSharpDatabaseSettings>();
1619
var agentDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
@@ -20,6 +23,7 @@ public async Task RefreshAgents()
2023
var user = _db.GetUserById(_user.Id);
2124
var agents = new List<Agent>();
2225
var userAgents = new List<UserAgent>();
26+
var agentTasks = new List<AgentTask>();
2327

2428
foreach (var dir in Directory.GetDirectories(agentDir))
2529
{
@@ -37,23 +41,18 @@ public async Task RefreshAgents()
3741
.SetFunctions(functions)
3842
.SetResponses(responses)
3943
.SetSamples(samples);
40-
41-
var userAgent = new UserAgent
42-
{
43-
Id = Guid.NewGuid().ToString(),
44-
UserId = user.Id,
45-
AgentId = agent.Id,
46-
Editable = false,
47-
CreatedTime = DateTime.UtcNow,
48-
UpdatedTime = DateTime.UtcNow
49-
};
50-
5144
agents.Add(agent);
45+
46+
var userAgent = BuildUserAgent(agent.Id, user.Id);
5247
userAgents.Add(userAgent);
48+
49+
var tasks = FetchTasksFromFile(dir);
50+
agentTasks.AddRange(tasks);
5351
}
5452

5553
_db.BulkInsertAgents(agents);
5654
_db.BulkInsertUserAgents(userAgents);
55+
_db.BulkInsertAgentTasks(agentTasks);
5756

5857
Utilities.ClearCache();
5958
}

src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ public void InsertAgentTask(AgentTask task)
136136
throw new NotImplementedException();
137137
}
138138

139+
public void BulkInsertAgentTasks(List<AgentTask> tasks)
140+
{
141+
throw new NotImplementedException();
142+
}
143+
139144
public void UpdateAgentTask(AgentTask task, AgentTaskField field)
140145
{
141146
throw new NotImplementedException();
@@ -145,6 +150,11 @@ public bool DeleteAgentTask(string agentId, string taskId)
145150
{
146151
throw new NotImplementedException();
147152
}
153+
154+
public bool DeleteAgentTasks()
155+
{
156+
throw new NotImplementedException();
157+
}
148158
#endregion
149159

150160
#region Conversation

src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.AgentTask.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ public void InsertAgentTask(AgentTask task)
130130
File.WriteAllText(taskFile, fileContent);
131131
}
132132

133+
public void BulkInsertAgentTasks(List<AgentTask> tasks)
134+
{
135+
136+
}
137+
133138
public void UpdateAgentTask(AgentTask task, AgentTaskField field)
134139
{
135140
if (task == null || string.IsNullOrEmpty(task.Id)) return;
@@ -202,6 +207,11 @@ public bool DeleteAgentTask(string agentId, string taskId)
202207
return true;
203208
}
204209

210+
public bool DeleteAgentTasks()
211+
{
212+
return false;
213+
}
214+
205215
private string? FindTaskFileById(string taskDir, string taskId)
206216
{
207217
if (!Directory.Exists(taskDir) || string.IsNullOrEmpty(taskId)) return null;

src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.AgentTask.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,26 @@ public void InsertAgentTask(AgentTask task)
9797
_dc.AgentTasks.InsertOne(taskDoc);
9898
}
9999

100+
public void BulkInsertAgentTasks(List<AgentTask> tasks)
101+
{
102+
if (tasks.IsNullOrEmpty()) return;
103+
104+
var taskDocs = tasks.Select(x => new AgentTaskDocument
105+
{
106+
Id = string.IsNullOrEmpty(x.Id) ? Guid.NewGuid().ToString() : x.Id,
107+
Name = x.Name,
108+
Description = x.Description,
109+
Enabled = x.Enabled,
110+
AgentId = x.AgentId,
111+
DirectAgentId = x.DirectAgentId,
112+
Content = x.Content,
113+
CreatedTime = x.CreatedDateTime,
114+
UpdatedTime = x.UpdatedDateTime
115+
}).ToList();
116+
117+
_dc.AgentTasks.InsertMany(taskDocs);
118+
}
119+
100120
public void UpdateAgentTask(AgentTask task, AgentTaskField field)
101121
{
102122
if (task == null || string.IsNullOrEmpty(task.Id)) return;
@@ -143,5 +163,18 @@ public bool DeleteAgentTask(string agentId, string taskId)
143163
var taskDeleted = _dc.AgentTasks.DeleteOne(filter);
144164
return taskDeleted.DeletedCount > 0;
145165
}
166+
167+
public bool DeleteAgentTasks()
168+
{
169+
try
170+
{
171+
_dc.AgentTasks.DeleteMany(Builders<AgentTaskDocument>.Filter.Empty);
172+
return true;
173+
}
174+
catch
175+
{
176+
return false;
177+
}
178+
}
146179
#endregion
147180
}

0 commit comments

Comments
 (0)