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

136 lines
4.4 KiB
C#
Raw Normal View History

2024-01-23 05:04:06 +00:00
using BotSharp.Abstraction.Agents.Models;
2024-05-15 20:54:08 +00:00
using BotSharp.Abstraction.Repositories;
using BotSharp.Abstraction.Users.Enums;
2024-01-23 05:04:06 +00:00
2023-08-19 00:15:02 +00:00
namespace BotSharp.OpenAPI.Controllers;
[Authorize]
[ApiController]
2023-12-27 15:53:54 +00:00
public class AgentController : ControllerBase
2023-08-19 00:15:02 +00:00
{
private readonly IAgentService _agentService;
2024-05-15 20:54:08 +00:00
private readonly IUserIdentity _user;
2023-09-21 16:23:43 +00:00
private readonly IServiceProvider _services;
2024-05-15 20:54:08 +00:00
public AgentController(IAgentService agentService, IUserIdentity user, IServiceProvider services)
2023-08-19 00:15:02 +00:00
{
_agentService = agentService;
2024-05-15 20:54:08 +00:00
_user = user;
2023-09-21 16:23:43 +00:00
_services = services;
2023-08-19 00:15:02 +00:00
}
2023-12-30 03:54:41 +00:00
[HttpGet("/agent/settings")]
public AgentSettings GetSettings()
{
var settings = _services.GetRequiredService<AgentSettings>();
return settings;
}
2023-10-11 04:11:06 +00:00
[HttpGet("/agent/{id}")]
public async Task<AgentViewModel> GetAgent([FromRoute] string id)
{
2024-01-28 01:02:33 +00:00
var agents = await GetAgents(new AgentFilter
{
AgentIds = new List<string> { id }
});
2024-03-22 06:30:57 +00:00
var targetAgent = agents.Items.FirstOrDefault();
var redirectAgentIds = targetAgent.RoutingRules
.Where(x => !string.IsNullOrEmpty(x.RedirectTo))
.Select(x => x.RedirectTo).ToList();
var redirectAgents = await _agentService.GetAgents(new AgentFilter
{
AgentIds = redirectAgentIds
});
foreach (var rule in targetAgent.RoutingRules)
{
var found = redirectAgents.Items.FirstOrDefault(x => x.Id == rule.RedirectTo);
if (found == null) continue;
rule.RedirectToAgentName = found.Name;
}
2024-05-15 20:54:08 +00:00
2024-05-15 22:30:45 +00:00
var editable = true;
2024-05-15 20:54:08 +00:00
var userService = _services.GetRequiredService<IUserService>();
var user = await userService.GetUser(_user.Id);
2024-05-15 22:30:45 +00:00
if (user?.Role != UserRole.Admin)
2024-05-15 20:54:08 +00:00
{
2024-05-15 22:30:45 +00:00
var userAgents = _agentService.GetAgentsByUser(user?.Id);
2024-05-15 20:54:08 +00:00
editable = userAgents?.Select(x => x.Id)?.Contains(targetAgent.Id) ?? false;
}
2024-05-15 22:30:45 +00:00
targetAgent.Editable = editable;
2024-03-22 06:30:57 +00:00
return targetAgent;
2023-10-11 04:11:06 +00:00
}
2024-01-28 01:02:33 +00:00
2024-01-23 17:32:28 +00:00
[HttpGet("/agents")]
public async Task<PagedItems<AgentViewModel>> GetAgents([FromQuery] AgentFilter filter)
2023-09-15 20:19:44 +00:00
{
2024-01-28 01:02:33 +00:00
var agentSetting = _services.GetRequiredService<AgentSettings>();
2024-01-23 05:04:06 +00:00
var pagedAgents = await _agentService.GetAgents(filter);
2024-01-28 01:02:33 +00:00
// prerender agent
2024-01-27 01:14:14 +00:00
var items = new List<Agent>();
foreach (var agent in pagedAgents.Items)
{
var renderedAgent = await _agentService.LoadAgent(agent.Id);
items.Add(renderedAgent);
}
2024-01-28 01:02:33 +00:00
// Set IsHost
var agents = items.Select(x => AgentViewModel.FromAgent(x)).ToList();
foreach(var agent in agents)
{
agent.IsHost = agentSetting.HostAgentId == agent.Id;
}
2024-01-23 05:04:06 +00:00
return new PagedItems<AgentViewModel>
{
2024-01-28 01:02:33 +00:00
Items = agents,
2024-01-23 05:04:06 +00:00
Count = pagedAgents.Count
};
2023-09-15 20:19:44 +00:00
}
2023-08-19 00:15:02 +00:00
[HttpPost("/agent")]
public async Task<AgentViewModel> CreateAgent(AgentCreationModel agent)
{
var createdAgent = await _agentService.CreateAgent(agent.ToAgent());
return AgentViewModel.FromAgent(createdAgent);
}
2023-10-17 20:29:40 +00:00
[HttpPost("/refresh-agents")]
2024-04-11 07:00:17 +00:00
public async Task<string> RefreshAgents()
2023-10-17 20:29:40 +00:00
{
2024-04-11 07:00:17 +00:00
return await _agentService.RefreshAgents();
2023-10-17 20:29:40 +00:00
}
2023-09-15 20:19:44 +00:00
[HttpPut("/agent/file/{agentId}")]
2024-04-11 07:00:17 +00:00
public async Task<string> UpdateAgentFromFile([FromRoute] string agentId)
2023-09-15 20:19:44 +00:00
{
2024-04-11 07:00:17 +00:00
return await _agentService.UpdateAgentFromFile(agentId);
2023-09-15 20:19:44 +00:00
}
2023-12-26 03:16:41 +00:00
[HttpPut("/agent/{agentId}")]
2023-09-15 20:19:44 +00:00
public async Task UpdateAgent([FromRoute] string agentId, [FromBody] AgentUpdateModel agent)
2023-08-19 00:15:02 +00:00
{
var model = agent.ToAgent();
model.Id = agentId;
2023-09-15 20:19:44 +00:00
await _agentService.UpdateAgent(model, AgentField.All);
2023-08-19 00:15:02 +00:00
}
2023-12-26 03:16:41 +00:00
[HttpPatch("/agent/{agentId}/{field}")]
public async Task PatchAgentByField([FromRoute] string agentId, AgentField field, [FromBody] AgentUpdateModel agent)
2023-12-13 20:26:46 +00:00
{
var model = agent.ToAgent();
model.Id = agentId;
2023-12-26 03:16:41 +00:00
await _agentService.UpdateAgent(model, field);
2023-12-13 20:26:46 +00:00
}
2024-05-09 22:06:03 +00:00
[HttpPatch("/agent/{agentId}/templates")]
public async Task<string> PatchAgentTemplates([FromRoute] string agentId, [FromBody] AgentTemplatePatchModel agent)
{
var model = agent.ToAgent();
model.Id = agentId;
return await _agentService.PatchAgentTemplate(model);
}
2023-08-19 00:15:02 +00:00
}