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.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.Filter.Eq(x => x.ConversationId, conversationId); var result = _dc.CrontabItems.DeleteMany(filter); return result.DeletedCount > 0; } public async ValueTask> GetCrontabItems(CrontabItemFilter filter) { if (filter == null) { filter = CrontabItemFilter.Empty(); } var cronBuilder = Builders.Filter; var cronFilters = new List>() { 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.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 { Items = crontabItems, Count = count }; } }