using Core; using Core.DTO; using Core.Models; using Liman.CadCam.DbModel; using LiMan.DB; using LiMan.DB.Controllers; using LiMan.DB.DBModels; using LiMan.DB.DTO; using LiMan.DB.Services; using LiMan.GLS; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NLog; using Org.BouncyCastle.Asn1.Pkcs; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; using System.Runtime; using System.Text; using System.Threading.Tasks; using static Core.Enum; namespace LiMan.UI.Data { public class LiManDataService : CommonDataServices { #region Public Fields public static GLS.Controllers.LicManController dbControllerGLS; #endregion Public Fields #region Public Constructors public LiManDataService(IConfiguration configuration, IConnectionMultiplexer redisConnMult, IEmailSender emailSender) : base(configuration, redisConnMult, emailSender) { // conf DB string connStrGLS = _configuration.GetConnectionString("LiMan.GLS"); if (string.IsNullOrEmpty(connStrGLS)) { Log.Error("Empty ConnString for LiMan.GLS!"); } else { dbControllerGLS = new LiMan.GLS.Controllers.LicManController(configuration); Log.Info("DbController for LiMan.GLS OK"); } } #endregion Public Constructors #region Public Methods public async Task> ApplicazioniGLSGetAll() { string source = "DB"; List? dbResult = new List(); try { string currKey = $"{Const.rKeyConfig}:GLS:Applicazioni"; Stopwatch sw = new Stopwatch(); sw.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbControllerGLS.GetApplicazioni(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } sw.Stop(); Log.Debug($"ApplicazioniGLSGetAll | {source} in: {sw.Elapsed.TotalMilliseconds:N2} ms"); } catch (Exception exc) { Log.Error($"Error during ApplicazioniGLSGetAll:{Environment.NewLine}{exc}"); } return dbResult; } public async Task ApplicazioniGLSUpdate(GLS.DatabaseModels.AnagApplicazioni currItem) { bool done = false; try { done = dbControllerGLS.UpdateApplicazioni(currItem); await FlushRedisCache(); } catch (Exception exc) { Log.Error($"Eccezione in ApplicazioniGLSUpdate:{Environment.NewLine}{exc}"); } return await Task.FromResult(done); } public async Task DbForceMigrate() { return await Task.FromResult(dbControllerGLS.DbForceMigrate()); } public override void Dispose() { base.Dispose(); // Clear database controller dbControllerGLS.Dispose(); } public async Task> InstallazioniGLSGetAll() { string source = "DB"; List dbResult = new List(); try { string currKey = $"{Const.rKeyConfig}:GLS:Installazioni:List"; Stopwatch sw = new Stopwatch(); sw.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbControllerGLS.GetInstallazioni(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } sw.Stop(); Log.Debug($"InstallazioniGLSGetAll | {source} in: {sw.Elapsed.TotalMilliseconds:N2} ms"); } catch (Exception exc) { Log.Error($"Error during InstallazioniGLSGetAll:{Environment.NewLine}{exc}"); } return dbResult; #if false List dbResult = new List(); string cacheKey = mHash("GLS:Installazioni"); string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbControllerGLS.GetInstallazioni(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB + caching per InstallazioniGLSGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); #endif } public async Task InstallazioniGLSUpdate(GLS.DatabaseModels.AnagInstallazioni currItem) { bool done = false; try { done = dbControllerGLS.UpdateInstallazioni(currItem); await FlushRedisCache(); } catch (Exception exc) { Log.Error($"Eccezione in InstallazioniGLSUpdate:{Environment.NewLine}{exc}"); } return await Task.FromResult(done); } /// /// Trasferisce una licenza da GLS a Next come LOG di una licenza scaduta /// /// /// public async Task LicenzaLogGlsNext(GLS.DatabaseModels.LicenzeAttive currItem, int IdxLicNext) { bool done = false; var currLicenza = dbController.GetLicenza(IdxLicNext); // step 1: converto licenza, faccio upsert var logLicNext = new LogLicenzaModel() { CodApp = currItem.ApplicativoNavigation.Applicativo, CodInst = currItem.InstallazioneNavigation.Installazione, Chiave = currItem.Licenza, NumLicenze = currItem.NumLicenze, Scadenza = currItem.Scadenza, Descrizione = currItem.ApplicativoNavigation.Descrizione, Tipo = TipoLicenza.GLS, IdxLic = IdxLicNext, Locked = true }; bool step1 = dbController.UpsertLogLic(logLicNext); if (currLicenza != null && step1) { // step 2: disattivo vecchia licenza currItem.Locked = true; done = dbControllerGLS.UpdateLicenze(currItem); } return await Task.FromResult(done); } /// /// Trasferisce una licenza da GLS a Next /// /// /// public async Task LicenzaTransferGlsNext(GLS.DatabaseModels.LicenzeAttive currItem) { bool done = false; // step 1: controllo applicazione esistente ApplicativoModel appNext = new ApplicativoModel() { CodApp = currItem.ApplicativoNavigation.Applicativo, Descrizione = currItem.ApplicativoNavigation.Descrizione }; bool step1 = dbController.ApplicazioniNextUpdate(appNext); // step 2: controllo installazione esistente var instNext = new InstallazioneModel() { Cliente = currItem.InstallazioneNavigation.Installazione, CodInst = currItem.InstallazioneNavigation.Installazione, Contatto = currItem.InstallazioneNavigation.Contatto, Email = currItem.InstallazioneNavigation.Email, Descrizione = currItem.ApplicativoNavigation.Descrizione }; bool step2 = dbController.UpsertInstallazione(instNext); // step 3: converto licenza, faccio upsert var licNext = new LicenzaModel() { CodApp = currItem.ApplicativoNavigation.Applicativo, CodInst = currItem.InstallazioneNavigation.Installazione, Chiave = currItem.Licenza, NumLicenze = currItem.NumLicenze, Scadenza = currItem.Scadenza, Descrizione = currItem.ApplicativoNavigation.Descrizione, Tipo = TipoLicenza.GLS, Enigma = "", Payload = "", DataEnigma = DateTime.Now }; bool step3 = dbController.UpsertLicenza(licNext); if (step1 && step2 && step3) { // step 4: disattivo vecchia licenza currItem.Locked = true; done = dbControllerGLS.UpdateLicenze(currItem); } return await Task.FromResult(done); } public async Task> LicenzeGLSGetAll() { string source = "DB"; List dbResult = new List(); try { string currKey = $"{Const.rKeyConfig}:GLS:Licenze:List"; Stopwatch sw = new Stopwatch(); sw.Start(); string rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbControllerGLS.GetLicenze(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } sw.Stop(); Log.Debug($"LicenzeGLSGetAll | {source} in: {sw.Elapsed.TotalMilliseconds:N2} ms"); } catch (Exception exc) { Log.Error($"Error during LicenzeGLSGetAll:{Environment.NewLine}{exc}"); } return dbResult; #if false List dbResult = new List(); string cacheKey = mHash("GLS:Licenze"); string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbControllerGLS.GetLicenze(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB + caching per LicenzeGLSGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); #endif } /// /// Recupera licenze SENZA cache /// /// /// public async Task> LicenzeGLSGetFilt(SelectGLS CurrFilter) { Stopwatch sw = new Stopwatch(); List dbResult = new List(); sw.Start(); dbResult = dbControllerGLS.GetLicenzeFilt(CurrFilter.OnlyActive, CurrFilter.OnlyUnlock, CurrFilter.ApplicazioneSel, CurrFilter.InstallazioneSel); sw.Stop(); Log.Trace($"Effettuata lettura da DB per LicenzeGLSGetFilt: {sw.Elapsed.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task LicenzeGLSUpdate(GLS.DatabaseModels.LicenzeAttive currItem) { bool done = false; #if false try { done = dbControllerGLS.UpdateApplicazioni(currItem); await InvalidateAllCache(); } catch (Exception exc) { Log.Error($"Eccezione in ApplicazioniUpdate:{Environment.NewLine}{exc}"); } #endif return await Task.FromResult(done); } public void rollBackEditGLS(object item) { dbControllerGLS.rollBackEntity(item); } #endregion Public Methods #region Protected Fields protected new static Logger Log = LogManager.GetCurrentClassLogger(); #endregion Protected Fields } }