Skip to content

Commit d911b8d

Browse files
authored
Merge pull request #142 from iceljc/features/refine-mongo-migration
Features/refine mongo migration
2 parents 4d25681 + 4ad51f0 commit d911b8d

File tree

9 files changed

+170
-41
lines changed

9 files changed

+170
-41
lines changed

src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public interface IAgentService
1818
Task<Agent> GetAgent(string id);
1919
Task<bool> DeleteAgent(string id);
2020
Task UpdateAgent(Agent agent);
21+
Task UpdateAgentFromFile(string id);
2122
string GetDataDir();
2223
string GetAgentDataDir(string agentId);
2324
}

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ join u in db.Users on ua.UserId equals u.Id
2929
var dbSettings = _services.GetRequiredService<BotSharpDatabaseSettings>();
3030
var agentSettings = _services.GetRequiredService<AgentSettings>();
3131
var filePath = Path.Combine(dbSettings.FileRepository, agentSettings.DataDir);
32-
var foundAgent = FetchAgentInfoFromFile(agent.Name, filePath);
32+
var foundAgent = FetchAgentFileByName(agent.Name, filePath);
3333

3434
if (foundAgent != null)
3535
{
@@ -62,14 +62,7 @@ join u in db.Users on ua.UserId equals u.Id
6262
return agentRecord;
6363
}
6464

65-
private JsonSerializerOptions _options = new JsonSerializerOptions
66-
{
67-
PropertyNameCaseInsensitive = true,
68-
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
69-
WriteIndented = true
70-
};
71-
72-
private Agent FetchAgentInfoFromFile(string agentName, string filePath)
65+
private Agent FetchAgentFileByName(string agentName, string filePath)
7366
{
7467
foreach (var dir in Directory.GetDirectories(filePath))
7568
{

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ join u in db.Users on ua.UserId equals u.Id
2727
if (!string.IsNullOrEmpty(agent.Instruction))
2828
record.Instruction = agent.Instruction;
2929

30+
if (!agent.Templates.IsNullOrEmpty())
31+
record.Templates = agent.Templates;
32+
3033
if (!agent.Functions.IsNullOrEmpty())
3134
record.Functions = agent.Functions;
3235

@@ -36,4 +39,57 @@ join u in db.Users on ua.UserId equals u.Id
3639
db.UpdateAgent(record);
3740
await Task.CompletedTask;
3841
}
42+
43+
public async Task UpdateAgentFromFile(string id)
44+
{
45+
var db = _services.GetRequiredService<IBotSharpRepository>();
46+
var agent = db.Agents?.FirstOrDefault(x => x.Id == id);
47+
48+
if (agent == null) return;
49+
50+
var dbSettings = _services.GetRequiredService<BotSharpDatabaseSettings>();
51+
var agentSettings = _services.GetRequiredService<AgentSettings>();
52+
var filePath = Path.Combine(dbSettings.FileRepository, agentSettings.DataDir);
53+
54+
var clonedAgent = Agent.Clone(agent);
55+
var foundAgent = FetchAgentFileById(agent.Id, filePath);
56+
if (foundAgent != null)
57+
{
58+
clonedAgent.SetId(foundAgent.Id)
59+
.SetName(foundAgent.Name)
60+
.SetDescription(foundAgent.Description)
61+
.SetIsPublic(foundAgent.IsPublic)
62+
.SetInstruction(foundAgent.Instruction)
63+
.SetTemplates(foundAgent.Templates)
64+
.SetFunctions(foundAgent.Functions)
65+
.SetResponses(foundAgent.Responses);
66+
67+
db.UpdateAgent(clonedAgent);
68+
}
69+
70+
71+
await Task.CompletedTask;
72+
}
73+
74+
private Agent FetchAgentFileById(string agentId, string filePath)
75+
{
76+
foreach (var dir in Directory.GetDirectories(filePath))
77+
{
78+
var agentJson = File.ReadAllText(Path.Combine(dir, "agent.json"));
79+
var agent = JsonSerializer.Deserialize<Agent>(agentJson, _options);
80+
if (agent != null && agent.Id == agentId)
81+
{
82+
var functions = FetchFunctionsFromFile(dir);
83+
var instruction = FetchInstructionFromFile(dir);
84+
var responses = FetchResponsesFromFile(dir);
85+
var templates = FetchTemplatesFromFile(dir);
86+
return agent.SetInstruction(instruction)
87+
.SetTemplates(templates)
88+
.SetFunctions(functions)
89+
.SetResponses(responses);
90+
}
91+
}
92+
93+
return null;
94+
}
3995
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public partial class AgentService : IAgentService
1010
private readonly ILogger _logger;
1111
private readonly IUserIdentity _user;
1212
private readonly AgentSettings _settings;
13+
private readonly JsonSerializerOptions _options;
1314

1415
public AgentService(IServiceProvider services,
1516
ILogger<AgentService> logger,
@@ -20,6 +21,12 @@ public AgentService(IServiceProvider services,
2021
_logger = logger;
2122
_user = user;
2223
_settings = settings;
24+
_options = new JsonSerializerOptions
25+
{
26+
PropertyNameCaseInsensitive = true,
27+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
28+
WriteIndented = true
29+
};
2330
}
2431

2532
public string GetDataDir()
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using BotSharp.Abstraction.Repositories;
2+
using BotSharp.Abstraction.Routing.Models;
3+
using System.IO;
4+
5+
namespace BotSharp.Core.Routing.Services;
6+
7+
public partial class RoutingService
8+
{
9+
public async Task<List<RoutingItem>> CreateRoutingItems(List<RoutingItem> routingItems)
10+
{
11+
var db = _services.GetRequiredService<IBotSharpRepository>();
12+
var items = FetchRoutingItemsFromFile();
13+
14+
if (items.IsNullOrEmpty())
15+
{
16+
items = routingItems?.ToList() ?? new List<RoutingItem>();
17+
}
18+
19+
var savedItems = db.CreateRoutingItems(items);
20+
return await Task.FromResult(savedItems.ToList());
21+
}
22+
23+
public async Task<List<RoutingProfile>> CreateRoutingProfiles(List<RoutingProfile> routingProfiles)
24+
{
25+
var db = _services.GetRequiredService<IBotSharpRepository>();
26+
var profiles = FetchRoutingProfilesFromFile();
27+
28+
if (profiles.IsNullOrEmpty())
29+
{
30+
profiles = routingProfiles?.ToList() ?? new List<RoutingProfile>();
31+
}
32+
33+
var savedProfiles = db.CreateRoutingProfiles(profiles);
34+
return await Task.FromResult(savedProfiles.ToList());
35+
}
36+
37+
private List<RoutingItem> FetchRoutingItemsFromFile()
38+
{
39+
var routingItems = new List<RoutingItem>();
40+
var dbSettings = _services.GetRequiredService<BotSharpDatabaseSettings>();
41+
var agentSettings = _services.GetRequiredService<AgentSettings>();
42+
var filePath = Path.Combine(dbSettings.FileRepository, agentSettings.DataDir, "route.json");
43+
44+
if (File.Exists(filePath))
45+
{
46+
routingItems = JsonSerializer.Deserialize<List<RoutingItem>>(File.ReadAllText(filePath), _options);
47+
}
48+
49+
return routingItems ?? new List<RoutingItem>();
50+
}
51+
52+
private List<RoutingProfile> FetchRoutingProfilesFromFile()
53+
{
54+
var routingProfiles = new List<RoutingProfile>();
55+
var dbSettings = _services.GetRequiredService<BotSharpDatabaseSettings>();
56+
var agentSettings = _services.GetRequiredService<AgentSettings>();
57+
var filePath = Path.Combine(dbSettings.FileRepository, agentSettings.DataDir, "routing-profile.json");
58+
59+
if (File.Exists(filePath))
60+
{
61+
routingProfiles = JsonSerializer.Deserialize<List<RoutingProfile>>(File.ReadAllText(filePath), _options);
62+
}
63+
64+
return routingProfiles ?? new List<RoutingProfile>();
65+
}
66+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using BotSharp.Abstraction.Repositories;
2+
3+
namespace BotSharp.Core.Routing.Services;
4+
5+
public partial class RoutingService
6+
{
7+
public async Task DeleteRoutingItems()
8+
{
9+
var db = _services.GetRequiredService<IBotSharpRepository>();
10+
db.DeleteRoutingItems();
11+
await Task.CompletedTask;
12+
}
13+
14+
public async Task DeleteRoutingProfiles()
15+
{
16+
var db = _services.GetRequiredService<IBotSharpRepository>();
17+
db.DeleteRoutingProfiles();
18+
await Task.CompletedTask;
19+
}
20+
}
Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,23 @@
11
using BotSharp.Abstraction.Repositories;
2-
using BotSharp.Abstraction.Repositories.Records;
32
using BotSharp.Abstraction.Routing;
43
using BotSharp.Abstraction.Routing.Models;
4+
using System.IO;
55

66
namespace BotSharp.Core.Routing.Services;
77

8-
public class RoutingService : IRoutingService
8+
public partial class RoutingService : IRoutingService
99
{
1010
private readonly IServiceProvider _services;
11+
private readonly JsonSerializerOptions _options;
1112

1213
public RoutingService(IServiceProvider service)
1314
{
1415
_services = service;
15-
}
16-
public async Task<List<RoutingItem>> CreateRoutingItems(List<RoutingItem> routingItems)
17-
{
18-
var db = _services.GetRequiredService<IBotSharpRepository>();
19-
var items = routingItems?.ToList() ?? new List<RoutingItem>();
20-
var savedItems = db.CreateRoutingItems(items);
21-
return await Task.FromResult(savedItems.ToList());
22-
}
23-
24-
public async Task<List<RoutingProfile>> CreateRoutingProfiles(List<RoutingProfile> routingProfiles)
25-
{
26-
var db = _services.GetRequiredService<IBotSharpRepository>();
27-
var profiles = routingProfiles?.ToList() ?? new List<RoutingProfile>();
28-
var savedProfiles = db.CreateRoutingProfiles(profiles);
29-
return await Task.FromResult(savedProfiles.ToList());
30-
}
31-
32-
public async Task DeleteRoutingItems()
33-
{
34-
var db = _services.GetRequiredService<IBotSharpRepository>();
35-
db.DeleteRoutingItems();
36-
await Task.CompletedTask;
37-
}
38-
39-
public async Task DeleteRoutingProfiles()
40-
{
41-
var db = _services.GetRequiredService<IBotSharpRepository>();
42-
db.DeleteRoutingProfiles();
43-
await Task.CompletedTask;
16+
_options = new JsonSerializerOptions
17+
{
18+
PropertyNameCaseInsensitive = true,
19+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
20+
WriteIndented = true
21+
};
4422
}
4523
}

src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ public async Task UpdateAgent([FromRoute] string agentId,
2929
await _agentService.UpdateAgent(model);
3030
}
3131

32+
[HttpPut("/agent/file/{agentId}")]
33+
public async Task UpdateAgentFromFile([FromRoute] string agentId)
34+
{
35+
await _agentService.UpdateAgentFromFile(agentId);
36+
}
37+
3238
[HttpGet("/agents")]
3339
public async Task<List<AgentViewModel>> GetAgents()
3440
{

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ public void UpdateAgent(Agent agent)
379379
Name = agent.Name,
380380
Description = agent.Description,
381381
Instruction = agent.Instruction,
382+
Templates = agent.Templates,
382383
Functions = agent.Functions,
383384
Responses = agent.Responses,
384385
IsPublic = agent.IsPublic,
@@ -391,12 +392,13 @@ public void UpdateAgent(Agent agent)
391392
.Set(x => x.Name, agent.Name)
392393
.Set(x => x.Description, agent.Description)
393394
.Set(x => x.Instruction, agent.Instruction)
395+
.Set(x => x.Templates, agent.Templates)
394396
.Set(x => x.Functions, agent.Functions)
395397
.Set(x => x.Responses, agent.Responses)
396398
.Set(x => x.IsPublic, agent.IsPublic)
397399
.Set(x => x.UpdatedTime, agent.UpdatedDateTime);
398400

399-
_dc.Agents.UpdateOne(filter, update, _options);
401+
_dc.Agents.UpdateOne(filter, update);
400402
}
401403

402404
public void DeleteRoutingItems()

0 commit comments

Comments
 (0)