using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Persistence.Database.Entity; using Persistence.Models; using Persistence.Repositories; using Persistence.Repository.Extensions; namespace Persistence.Repository.Repositories { public class TechMessagesRepository : ITechMessagesRepository { private static readonly string SystemCacheKey = $"{typeof(ADSystem).FullName}CacheKey"; private readonly IMemoryCache memoryCache; private DbContext db; public TechMessagesRepository(DbContext db, IMemoryCache memoryCache) { this.memoryCache = memoryCache; this.db = db; } protected virtual IQueryable GetQueryReadOnly() => db.Set() .Include(e => e.System); public async Task> GetPage(RequestDto request, CancellationToken token) { var query = GetQueryReadOnly(); var entities = await query .SortBy(request.SortSettings) .Skip(request.Skip) .Take(request.Take) .ToListAsync(); var dto = new PaginationContainer() { Skip = request.Skip, Take = request.Take, Count = entities.Count, Items = entities.Select(e => e.Adapt()) }; return dto; } public async Task> GetStatistics(int? importantId, string? autoDrillingSystem, CancellationToken token) { var query = GetQueryReadOnly(); var count = await query .Where(e => importantId == null || e.CategoryId == importantId) .Where(e => autoDrillingSystem == null || e.System.Name == autoDrillingSystem) .GroupBy(e => e.System.Name) .ToDictionaryAsync(e => e.Key, v => v.Count()); return count; } public async Task> GetSystems(CancellationToken token) { var entities = await GetSystems(); var systems = entities.Select(e => e.Name); return systems ?? []; } public async Task InsertRange(IEnumerable dtos, CancellationToken token) { var entities = new List(); foreach (var dto in dtos) { var entity = dto.Adapt(); var systems = await GetSystems(); var systemId = systems.FirstOrDefault(e => e.Name == dto.System)?.SystemId ?? await CreateSystem(dto.System); entity.SystemId = systemId; entities.Add(entity); } await db.Set().AddRangeAsync(entities, token); var result = await db.SaveChangesAsync(token); return result; } private async Task> GetSystems() { var systems = await memoryCache.GetOrCreateAsync(SystemCacheKey, async f => { f.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60); var query = db.Set(); var entities = await query.ToListAsync(); var dtos = entities.Select(e => e.Adapt()); return dtos; }); return systems ?? []; } private async Task CreateSystem(string name) { memoryCache.Remove(SystemCacheKey); var systemId = Guid.NewGuid(); var entity = new ADSystem() { SystemId = systemId, Name = name }; await db.Set().AddAsync(entity); await db.SaveChangesAsync(); return systemId; } } }