BotSharp/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs
2025-08-11 15:46:35 -05:00

97 lines
2.9 KiB
C#

using BotSharp.Abstraction.Crontab.Models;
using Microsoft.Extensions.Logging;
namespace BotSharp.Plugin.MongoStorage.Repository;
public partial class MongoRepository
{
public bool UpsertCrontabItem(CrontabItem item)
{
if (item == null || string.IsNullOrWhiteSpace(item.ConversationId))
{
return false;
}
try
{
var cronDoc = CrontabItemDocument.ToMongoModel(item);
cronDoc.Id = Guid.NewGuid().ToString();
var filter = Builders<CrontabItemDocument>.Filter.Eq(x => x.ConversationId, item.ConversationId);
var result = _dc.CrontabItems.ReplaceOne(filter, cronDoc, new ReplaceOptions
{
IsUpsert = true
});
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error when saving crontab item (agent id: {item.AgentId}, conv id: {item.ConversationId}).");
return false;
}
}
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;
}
public async ValueTask<PagedItems<CrontabItem>> GetCrontabItems(CrontabItemFilter filter)
{
if (filter == null)
{
filter = CrontabItemFilter.Empty();
}
var cronBuilder = Builders<CrontabItemDocument>.Filter;
var cronFilters = new List<FilterDefinition<CrontabItemDocument>>() { cronBuilder.Empty };
// Filter cron
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 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;
var crontabItems = docs.Select(x => CrontabItemDocument.ToDomainModel(x)).ToList();
return new PagedItems<CrontabItem>
{
Items = crontabItems,
Count = count
};
}
}