using Microsoft.AspNetCore.Mvc; using MP.Data.Conf; using MP.Data.DatabaseModels; using MP.WASM.Mon.Data; using Newtonsoft.Json; using NLog; using StackExchange.Redis; namespace MP.WASM.Mon.Server.Controllers { [ApiController] [Route("api/[controller]")] public class MSEController : ControllerBase { #region Public Constructors /// /// Dataservice x accesso DB /// protected MpDataService _DataService { get; set; } /// /// Avvio controller dei dati MSE /// /// public MSEController(MpDataService DataService, IConfiguration configuration, ILogger logger) { _logger = logger; _configuration = configuration; _DataService = DataService; Log.Info("Avviata classe MSEController"); // setup conf IOB da dizionario tryLoadIobTags(); } #endregion Public Constructors #region Public Properties /// /// Dizionario dei tag configurati per IOB /// public Dictionary> currTagConf { get; set; } = new Dictionary>(); #endregion Public Properties #region Public Methods [HttpGet("getConfig")] public Task> ConfigGetAll() { return _DataService.ConfigGetAll(); } /// /// restituisce il valore da REDIS associato al tag richeisto /// /// Chiave in cui cercare il valore /// [HttpGet("getTagConf/{redKey}")] public string getTagConf(string redKey) { return _DataService.getTagConf(redKey); } [HttpGet("getMachines")] public Task> MacchineGetAll() { return _DataService.MacchineGetAll(); } /// /// Metodo principale x ricevere tutte i dati MSE di tutti gli impianti /// /// [HttpGet()] public Task> MseGetAll() { return _DataService.MseGetAll(); } #endregion Public Methods #region Private Fields private static IConfiguration _configuration = null!; private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); //private static ILogger _logger = null!; private readonly ILogger _logger; /// /// Oggetto per connessione a REDIS /// private ConnectionMultiplexer redisConn = null!; /// /// Oggetto DB redis da impiegare x chiamate R/W /// private IDatabase redisDb = null!; #endregion Private Fields #region Private Methods /// /// Prova a caricare da file la conf degli IOB se presente /// private void tryLoadIobTags() { Dictionary> currConf = new Dictionary>(); string strExeFilePath = System.Reflection.Assembly.GetExecutingAssembly().Location; if (!string.IsNullOrEmpty(strExeFilePath)) { string? strWorkPath = Path.GetDirectoryName(strExeFilePath); if (!string.IsNullOrEmpty(strWorkPath)) { string filePath = $"{strWorkPath}/Conf/iobTagsConf.json"; if (System.IO.File.Exists(filePath)) { string rawData = System.IO.File.ReadAllText(filePath); if (!string.IsNullOrEmpty(rawData)) { var fileConfData = JsonConvert.DeserializeObject(rawData); if (fileConfData != null) { // effettuo esplosione conf SE contenesse il valore "***" = tutti // gli IOB if (fileConfData.IobSetup.ContainsKey("***")) { // recupero elenco macchine... var elencoMacc = _DataService.MacchineGetAll().Result; // x ogni macchina creo le righe standard da conf... var baseConf = fileConfData.IobSetup.Where(x => x.Key == "***").FirstOrDefault(); foreach (var item in elencoMacc) { if (!string.IsNullOrEmpty(item.IdxMacchina)) { // converto i valori x la macchina corrente... clono in // nuovo oggetto var specVal = baseConf.Value.Select(i => i.Clone()).ToList(); // sostituisco segnaposto foreach (var singleVal in specVal) { singleVal.TagLocation = singleVal.TagLocation.Replace("***", item.IdxMacchina); } // ora aggiungo eventuali valori in override... if (fileConfData.IobSetup.ContainsKey(item.IdxMacchina)) { var otConf = fileConfData.IobSetup.Where(x => x.Key == item.IdxMacchina).FirstOrDefault(); //verifico x ogni valore other... foreach (var otTag in otConf.Value) { var ovrTag = specVal.Where(x => x.ColNum == otTag.ColNum && x.RowNum == otTag.RowNum).FirstOrDefault(); // se contiene --> sovrascrivo if (ovrTag != null) { //ovrTag = otTag.Clone(); specVal.Remove(ovrTag); specVal.Add(otTag.Clone()); } // se non contiene --> aggiungo else { specVal.Add(otTag); } } } currConf.Add(item.IdxMacchina, specVal); } } } // altrimenti copio ed ho finito else { currConf = fileConfData.IobSetup; } } } } if (currConf != null) { currTagConf = currConf; } } } } #endregion Private Methods } }