Files
lux/Lux.API/Services/ExternalMessageProcessor.cs
T

213 lines
9.1 KiB
C#

using EgwCoreLib.Lux.Data.Services;
using EgwCoreLib.Lux.Data;
using Newtonsoft.Json;
using NLog;
using StackExchange.Redis;
using System.Diagnostics;
using EgwMultiEngineManager.Data;
namespace Lux.API.Services
{
public class ExternalMessageProcessor
{
#region Public Constructors
/// <summary>
/// Init classe message processor con accesso REDIS e DB
/// </summary>
/// <param name="imgService"></param>
/// <param name="dlService"></param>
public ExternalMessageProcessor(ImageCacheService imgService, DataLayerServices dlService)
{
cacheService = imgService;
dbService = dlService;
}
#endregion Public Constructors
#region Public Methods
public async Task HandleResultMessageAsync(string channel, string message)
{
Log.Info($"Processing message from {channel} | {message.Length}");
Stopwatch sw = new Stopwatch();
sw.Start();
string rawData = $"{message}";
if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2)
{
try
{
var retData = JsonConvert.DeserializeObject<AnswerDTO>(rawData);
if (retData != null)
{
if (retData.Args != null && retData.Args.Count > 0)
{
/*------------------------------------------
* Richieste "continue" di stato/update *
* ----------------------------------------*/
// gestione ritorno preview SVG
if (retData.Args.ContainsKey("Svg"))
{
// recupero UID ed SVG
string UID = retData.Args["UID"];
string newSvg = retData.Args["Svg"];
// reinvio in redis (cache + channel)
await cacheService.SaveSvgAsync(UID, retData.ExecEnvironment, newSvg);
}
// gestione ritorno preview PNG
if (retData.Args.ContainsKey("Png"))
{
// recupero UID ed SVG
string UID = retData.Args["UID"];
string newPng = retData.Args["Png"];
// reinvio in redis (cache + channel)
await cacheService.SavePngAsync(UID, retData.ExecEnvironment, newPng);
}
// gesitone ritorno BOM
if (retData.Args.ContainsKey("BOM"))
{
// recupero UID e BOM
string UID = retData.Args["UID"];
string newBom = retData.Args["BOM"];
// salvo BOM ricevuta RAW in redis (cache)
await cacheService.SaveBomAsync(UID, retData.ExecEnvironment, newBom);
// salvo la BOM completa con i dati recuperati dal DB
await dbService.SaveBomAsync(UID, retData.ExecEnvironment, newBom);
// pubblico refresh info così da segnalare richiesta di update conseguente
await cacheService.PublishUpdateAsync(UID, retData.ExecEnvironment);
}
// gestione ritorno tipo Shape
if (retData.Args.ContainsKey("SashShape"))
{
// recupero UID ed SVG
string UID = retData.Args["UID"];
string newShape = retData.Args["SashShape"];
// reinvio in redis (cache + channel)
await cacheService.SaveShapeAsync(UID, retData.ExecEnvironment, newShape);
}
// gestione ritorno opzioni HW
if (retData.Args.ContainsKey("HardwareOptions"))
{
// recupero UID ed SVG
string UID = retData.Args["UID"];
string newHwOpt = retData.Args["HardwareOptions"];
// reinvio in redis (cache + channel)
await cacheService.SaveHwOptAsync(UID, retData.ExecEnvironment, newHwOpt);
}
/*------------------------------------------
* Richieste "one shot" di configurazione
* - fare 1/gg o su richiesta utente
* ----------------------------------------*/
// Gestione ritorno lista preferiti HW (ammissibili)
if (retData.Args.ContainsKey("HardwareModelList"))
{
// recupero UID e lista preferiti HW
string UID = retData.Args["UID"];
string newHml = retData.Args["HardwareModelList"];
// salvo HardwareList ricevuta
await cacheService.SaveHmlAsync(UID, retData.ExecEnvironment, newHml);
await dbService.SaveHmlAsync(UID, retData.ExecEnvironment, newHml);
}
// gestione ritorno lista profili VALIDI per JWD
if (retData.Args.ContainsKey("ProfileList"))
{
// recupero UID e elenco profili validi
string UID = retData.Args["UID"];
string profList = retData.Args["ProfileList"];
// salvo ProfileList ricevuta
await cacheService.SaveProfileListAsync(UID, retData.ExecEnvironment, profList);
await dbService.SaveProfileListAsync(UID, retData.ExecEnvironment, profList);
}
}
}
}
catch (Exception exc)
{
Log.Error($"Errore in fase decodifica messaggio da REDIS Channel{Environment.NewLine}{exc}");
}
}
sw.Stop();
Log.Info($"HandleResultMessageAsync | {sw.Elapsed.TotalMilliseconds:N3} ms");
#if false
// Process message (parse, validate, act)
var payload = message; // or JSON-deserialize, etc.
await _redisService.SetAsync("last:result", payload);
#endif
}
#endregion Public Methods
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
private readonly ImageCacheService cacheService;
private readonly DataLayerServices dbService;
#endregion Private Fields
#if false
/// <summary>
/// Restituisce una risposta all'esecuzione
/// </summary>
/// <param name="ProcessArgsResult"></param>
private void ProcessMan_m_AnswerReceived(ProcessArgsResult result)
{
// verifico che sia la mia richiesta con id immagine... FARE!!!
// salvo il risultato...
if (result.Args != null && result.Args.Count > 0)
{
if (result.Args.ContainsKey("Svg"))
{
// salvo SVG
string newSvg = result.Args["Svg"];
// salvo nel dizionario
lastSvg = newSvg;
// salvo su redis
_imgService.SaveSvg("123456", lastSvg);
}
}
}
/// <summary>
/// Salva risultato calcolo da broadcast channel REDIS
/// </summary>
/// <param name="channel"></param>
/// <param name="message"></param>
private void SaveCalcData(RedisChannel channel, RedisValue message)
{
string rawData = $"{message}";
if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2)
{
// provo a deserializzare
try
{
var retData = JsonConvert.DeserializeObject<ProcessArgsResult>(rawData);
if (retData != null)
{
// verifico nId di risposta x salvare correttamente
ProcessMan_m_AnswerReceived(retData);
}
}
catch (Exception exc)
{
_logger.LogError($"Errore in fase decodifica messaggio da REDIS Channel{Environment.NewLine}{exc}");
}
}
}
#endif
}
}