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

97 lines
2.9 KiB
C#
Raw Normal View History

2024-12-09 00:29:04 +00:00
using BotSharp.Abstraction.Crontab.Models;
using Microsoft.Extensions.Logging;
namespace BotSharp.Plugin.MongoStorage.Repository;
public partial class MongoRepository
{
2024-12-10 21:16:03 +00:00
public bool UpsertCrontabItem(CrontabItem item)
2024-12-09 00:29:04 +00:00
{
2024-12-10 21:16:03 +00:00
if (item == null || string.IsNullOrWhiteSpace(item.ConversationId))
2024-12-09 00:29:04 +00:00
{
return false;
}
try
{
var cronDoc = CrontabItemDocument.ToMongoModel(item);
2024-12-10 18:50:13 +00:00
cronDoc.Id = Guid.NewGuid().ToString();
2024-12-10 21:16:03 +00:00
var filter = Builders<CrontabItemDocument>.Filter.Eq(x => x.ConversationId, item.ConversationId);
var result = _dc.CrontabItems.ReplaceOne(filter, cronDoc, new ReplaceOptions
{
IsUpsert = true
});
2024-12-09 00:29:04 +00:00
return true;
}
catch (Exception ex)
{
2025-05-02 16:31:28 +00:00
_logger.LogError(ex, $"Error when saving crontab item (agent id: {item.AgentId}, conv id: {item.ConversationId}).");
2024-12-09 00:29:04 +00:00
return false;
}
}
2024-12-10 21:16:03 +00:00
public bool DeleteCrontabItem(string conversationId)
{
if (string.IsNullOrWhiteSpace(conversationId))
{
return false;
}
var filter = Builders<CrontabItemDocument>.Filter.Eq(x => x.ConversationId, conversationId);
var result = _dc.CrontabItems.DeleteMany(filter);
return result.DeletedCount > 0;
}
2025-08-11 20:46:35 +00:00
public async ValueTask<PagedItems<CrontabItem>> GetCrontabItems(CrontabItemFilter filter)
2024-12-09 00:29:04 +00:00
{
if (filter == null)
{
filter = CrontabItemFilter.Empty();
}
var cronBuilder = Builders<CrontabItemDocument>.Filter;
var cronFilters = new List<FilterDefinition<CrontabItemDocument>>() { cronBuilder.Empty };
2024-12-10 21:16:03 +00:00
// Filter cron
2024-12-09 00:29:04 +00:00
if (filter?.AgentIds != null)
{
cronFilters.Add(cronBuilder.In(x => x.AgentId, filter.AgentIds));
}
if (filter?.ConversationIds != null)
{
cronFilters.Add(cronBuilder.In(x => x.ConversationId, filter.ConversationIds));
}
if (filter?.UserIds != null)
{
cronFilters.Add(cronBuilder.In(x => x.UserId, filter.UserIds));
}
// Sort and paginate
var filterDef = cronBuilder.And(cronFilters);
var sortDef = Builders<CrontabItemDocument>.Sort.Descending(x => x.CreatedTime);
2025-08-11 20:46:35 +00:00
var docsTask = _dc.CrontabItems.FindAsync(filterDef, options: new()
{
Sort = sortDef,
Skip = filter.Offset,
Limit = filter.Size
});
var countTask = _dc.CrontabItems.CountDocumentsAsync(filterDef);
await Task.WhenAll([docsTask, countTask]);
var docs = docsTask.Result.ToList();
var count = countTask.Result;
2024-12-09 00:29:04 +00:00
2025-08-11 20:46:35 +00:00
var crontabItems = docs.Select(x => CrontabItemDocument.ToDomainModel(x)).ToList();
2024-12-09 00:29:04 +00:00
return new PagedItems<CrontabItem>
{
Items = crontabItems,
2025-08-11 20:46:35 +00:00
Count = count
2024-12-09 00:29:04 +00:00
};
}
}