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

88 lines
2.7 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;
}
2024-12-09 00:29:04 +00:00
public PagedItems<CrontabItem> GetCrontabItems(CrontabItemFilter filter)
{
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);
var cronDocs = _dc.CrontabItems.Find(filterDef).Sort(sortDef).Skip(filter.Offset).Limit(filter.Size).ToList();
var count = _dc.CrontabItems.CountDocuments(filterDef);
var crontabItems = cronDocs.Select(x => CrontabItemDocument.ToDomainModel(x)).ToList();
return new PagedItems<CrontabItem>
{
Items = crontabItems,
Count = (int)count
};
}
}