using Microsoft.Extensions.Configuration; using System; using Microsoft.Extensions.Logging; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NLog; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using System.Diagnostics; using System.Text; using Newtonsoft.Json; using System.Diagnostics.Eventing.Reader; namespace MP.Land.Data { public class AppAuthService : IDisposable { #region Private Fields private static IConfiguration _configuration; private static ILogger _logger; private static List ElencoMacchine = new List(); private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); private readonly IDistributedCache distributedCache; private readonly IMemoryCache memoryCache; /// /// Durata assoluta massima della cache /// private int chAbsExp = 15; /// /// Durata della cache in modalità inattiva (non acceduta) prima di venire rimossa /// NON estende oltre il tempo massimo di validità della cache (chAbsExp) /// private int chSliExp = 5; private Dictionary Vocabolario = new Dictionary(); #endregion Private Fields #region Public Fields public static AppAuth.Controllers.AppAuthController dbController; public static AppAuth.Controllers.MPController MpDbController; #endregion Public Fields #region Public Constructors public AppAuthService(IConfiguration configuration, ILogger logger, IMemoryCache memoryCache, IDistributedCache distributedCache) { _logger = logger; _configuration = configuration; // conf cache this.memoryCache = memoryCache; this.distributedCache = distributedCache; // conf DB string connStr = _configuration.GetConnectionString("MP.Land"); if (string.IsNullOrEmpty(connStr)) { _logger.LogError("ConnString empty!"); } else { dbController = new AppAuth.Controllers.AppAuthController(configuration); MpDbController = new AppAuth.Controllers.MPController(configuration); _logger.LogInformation("DbController OK"); } } #endregion Public Constructors #region Private Properties private DistributedCacheEntryOptions cacheOpt { get { return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); } } private DistributedCacheEntryOptions cacheOptLong { get { return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp * 10)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); } } #endregion Private Properties #region Protected Methods protected void CheckVoc() { string cacheKey = ":MP:VOCAB"; string rawData; if (Vocabolario.Count == 0) { var redisDataList = distributedCache.Get(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); Vocabolario = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Vocabolario = dbController.VocabolarioGetAll().ToDictionary(x => $"{x.Lingua}#{x.Lemma}", x => x.Traduzione); rawData = JsonConvert.SerializeObject(Vocabolario); redisDataList = Encoding.UTF8.GetBytes(rawData); distributedCache.Set(cacheKey, redisDataList, cacheOptLong); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuato rilettura da DB + caching per Vocabolario: {ts.TotalMilliseconds} ms"); } } } #endregion Protected Methods #region Public Methods public async Task> AnagGruppiAll() { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.AnagGruppiGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB per AnagGruppiAll: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task> AnagGruppiFilt(string codTipo) { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.AnagGruppiFilt(codTipo); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB per AnagGruppiFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task> AnagOperByGroupList(string codGruppo, string searchVal) { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var rawData = dbController .AnagOpByGruppoGetFilt(codGruppo, searchVal); dbResult = rawData .GroupBy(user => user.MatrOpr) .Select(grp => grp.First()) .ToList(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB per AnagOperByGroupList: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task> AnagOperList(string searchVal) { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.AnagOpGetAll(searchVal); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB per AnagOperList: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public void Dispose() { // Clear database controller dbController.Dispose(); MpDbController.Dispose(); } public string Traduci(string lemma, string lingua = "IT") { string answ = $"__{lemma}__"; string keyReq = $"{lingua}#{lemma}"; CheckVoc(); // cerco in vocabolario... if (Vocabolario.ContainsKey(keyReq)) { answ = Vocabolario[keyReq]; } return answ; } public async Task> UpdManList() { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.UpdManGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB per UpdManList: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task> AnagKeyValList() { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = MpDbController.AnagKeyValuesGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB per AnagKeyValList: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task ResetCache() { string cacheKey = ":MP:VOCAB"; await distributedCache.RemoveAsync(cacheKey); } #endregion Public Methods } }