/
d.alekseev
/
SmartMenuBot
Обзор
Документация
Войти
/
d.alekseev
/
SmartMenuBot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
ConsoleBot/Infrastructure/DataAccess/InMemoryToDoRepository.cs
95 строк
3 KB
d.alekseev
feat: нотификации и фоновые задачи доставки уведомлений
26 фев 2026, 10:55
26 фев 2026, 10:55
4338916
Код
Авторство
О чём код?
using SmartMenuBot.Core.DataAccess; using SmartMenuBot.Core.Entities; using SmartMenuBot.Core.Exceptions; namespace SmartMenuBot.Infrastructure.DataAccess { public class InMemoryToDoRepository : IToDoRepository { private readonly List<ToDoItem> _items = []; public Task AddAsync(ToDoItem item, CancellationToken ct) { _items.Add(item); return Task.CompletedTask; } public async Task<int> CountActiveAsync(Guid userId, CancellationToken ct) { var activeItems = await GetActiveByUserIdAsync(userId, ct); return activeItems.Count; } public Task DeleteAsync(Guid id, CancellationToken ct) { var item = _items.FirstOrDefault(i => i.Id == id); if (item != null) { _items.Remove(item); } return Task.CompletedTask; } public Task<bool> ExistsByNameAsync(Guid userId, string name, CancellationToken ct) { return Task.FromResult( _items.Any(item => item.User.UserId == userId && item.Name.Equals(name, StringComparison.OrdinalIgnoreCase))); } public Task<ToDoItem?> GetAsync(Guid id, CancellationToken ct) { return Task.FromResult(_items.FirstOrDefault(item => item.Id == id)); } public Task<IReadOnlyList<ToDoItem>> GetActiveByUserIdAsync(Guid userId, CancellationToken ct) { IReadOnlyList<ToDoItem> result = _items .Where(item => item.User.UserId == userId && item.State == ToDoItemState.Active) .ToList().AsReadOnly(); return Task.FromResult(result); } public Task<IReadOnlyList<ToDoItem>> GetAllByUserIdAsync(Guid userId, CancellationToken ct) { IReadOnlyList<ToDoItem> result = _items .Where(item => item.User.UserId == userId) .ToList().AsReadOnly(); return Task.FromResult(result); } public Task<IReadOnlyList<ToDoItem>> GetActiveWithDeadline(Guid userId, DateTime from, DateTime to, CancellationToken ct) { IReadOnlyList<ToDoItem> result = _items .Where(item => item.User.UserId == userId && item.State == ToDoItemState.Active && item.Deadline >= from && item.Deadline < to) .OrderBy(item => item.Deadline) .ToList() .AsReadOnly(); return Task.FromResult(result); } public Task<IReadOnlyList<ToDoItem>> FindAsync(Guid userId, Func<ToDoItem, bool> predicate, CancellationToken ct) { IReadOnlyList<ToDoItem> result = _items .Where(item => item.User.UserId == userId && predicate(item)) .ToList().AsReadOnly(); return Task.FromResult(result); } public async Task UpdateAsync(ToDoItem item, CancellationToken ct) { ArgumentNullException.ThrowIfNull(item); var existingItem = await GetAsync(item.Id, ct) ?? throw new EntityNotFoundException(item.Id, "Задача"); var index = _items.IndexOf(existingItem); _items[index] = item; } } }