2024-11-25 13:49:07 +05:00
|
|
|
|
using Mapster;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
2024-11-28 08:55:50 +05:00
|
|
|
|
using Microsoft.Extensions.Caching.Memory;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
2024-11-25 13:49:07 +05:00
|
|
|
|
using Persistence.Database.Entity;
|
|
|
|
|
using Persistence.Models;
|
|
|
|
|
using Persistence.Repositories;
|
2024-11-26 12:27:52 +05:00
|
|
|
|
using Persistence.Repository.Extensions;
|
2024-11-25 13:49:07 +05:00
|
|
|
|
|
|
|
|
|
namespace Persistence.Repository.Repositories
|
|
|
|
|
{
|
|
|
|
|
public class TechMessagesRepository : ITechMessagesRepository
|
|
|
|
|
{
|
2024-11-28 08:55:50 +05:00
|
|
|
|
private static readonly string SystemCacheKey = $"{typeof(ADSystem).FullName}CacheKey";
|
|
|
|
|
private readonly IMemoryCache memoryCache;
|
2024-11-25 13:49:07 +05:00
|
|
|
|
private DbContext db;
|
2024-11-28 08:55:50 +05:00
|
|
|
|
|
|
|
|
|
public TechMessagesRepository(DbContext db, IMemoryCache memoryCache)
|
2024-11-25 13:49:07 +05:00
|
|
|
|
{
|
2024-11-28 08:55:50 +05:00
|
|
|
|
this.memoryCache = memoryCache;
|
2024-11-25 13:49:07 +05:00
|
|
|
|
this.db = db;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual IQueryable<TechMessage> GetQueryReadOnly() => db.Set<TechMessage>();
|
|
|
|
|
|
2024-11-26 10:23:48 +05:00
|
|
|
|
public async Task<PaginationContainer<TechMessageDto>> 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<TechMessageDto>()
|
|
|
|
|
{
|
|
|
|
|
Skip = request.Skip,
|
|
|
|
|
Take = request.Take,
|
|
|
|
|
Count = entities.Count,
|
|
|
|
|
Items = entities.Select(e => e.Adapt<TechMessageDto>())
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return dto;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-28 08:55:50 +05:00
|
|
|
|
public async Task<Dictionary<string, int>> GetStatistics(int? importantId, string? autoDrillingSystem, CancellationToken token)
|
2024-11-25 13:49:07 +05:00
|
|
|
|
{
|
|
|
|
|
var query = GetQueryReadOnly();
|
|
|
|
|
var count = await query
|
2024-11-28 08:55:50 +05:00
|
|
|
|
.Where(e => importantId == null || e.ImportantId == importantId)
|
|
|
|
|
.Where(e => autoDrillingSystem == null || e.System.Name == autoDrillingSystem)
|
|
|
|
|
.GroupBy(e => e.System.Name)
|
|
|
|
|
.ToDictionaryAsync(e => e.Key, v => v.Count());
|
2024-11-25 13:49:07 +05:00
|
|
|
|
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-28 08:55:50 +05:00
|
|
|
|
public async Task<IEnumerable<ADSystemDto>> GetSystems(CancellationToken token)
|
2024-11-25 13:49:07 +05:00
|
|
|
|
{
|
2024-11-28 08:55:50 +05:00
|
|
|
|
var systems = await memoryCache.GetOrCreateAsync(SystemCacheKey, async f =>
|
|
|
|
|
{
|
|
|
|
|
f.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
|
|
|
|
|
|
|
|
|
|
var query = db.Set<ADSystem>();
|
|
|
|
|
var entities = await query.ToListAsync();
|
|
|
|
|
var dtos = entities.Select(e => e.Adapt<ADSystemDto>());
|
2024-11-25 13:49:07 +05:00
|
|
|
|
|
2024-11-28 08:55:50 +05:00
|
|
|
|
return dtos;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return systems ?? [];
|
2024-11-25 13:49:07 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<int> InsertRange(IEnumerable<TechMessageDto> dtos, CancellationToken token)
|
|
|
|
|
{
|
2024-11-28 08:55:50 +05:00
|
|
|
|
var entities = dtos.Select(dto =>
|
|
|
|
|
{
|
|
|
|
|
var task = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
var entity = dto.Adapt<TechMessage>();
|
|
|
|
|
var systems = await GetSystems(token);
|
|
|
|
|
var systemId = systems.FirstOrDefault(e => e.Name == dto.System)?.SystemId
|
|
|
|
|
?? await CreateSystem(dto.System);
|
|
|
|
|
|
|
|
|
|
entity.SystemId = systemId;
|
|
|
|
|
|
|
|
|
|
return entity;
|
|
|
|
|
});
|
|
|
|
|
task.Wait();
|
|
|
|
|
|
|
|
|
|
return task.Result;
|
|
|
|
|
});
|
2024-11-25 13:49:07 +05:00
|
|
|
|
|
|
|
|
|
await db.Set<TechMessage>().AddRangeAsync(entities, token);
|
|
|
|
|
var result = await db.SaveChangesAsync(token);
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
2024-11-28 08:55:50 +05:00
|
|
|
|
|
|
|
|
|
private async Task<Guid> CreateSystem(string name)
|
|
|
|
|
{
|
|
|
|
|
memoryCache.Remove(SystemCacheKey);
|
|
|
|
|
|
|
|
|
|
var systemId = Guid.NewGuid();
|
|
|
|
|
var entity = new ADSystem()
|
|
|
|
|
{
|
|
|
|
|
SystemId = systemId,
|
|
|
|
|
Name = name
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
await db.Set<ADSystem>().AddAsync(entity);
|
|
|
|
|
await db.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
return Guid.NewGuid();
|
|
|
|
|
}
|
2024-11-25 13:49:07 +05:00
|
|
|
|
}
|
|
|
|
|
}
|