Files
lux/Lux.API/Services/ExternalMessageProcessor.cs
T
2025-11-07 17:14:43 +01:00

163 lines
7.3 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
}
}