From 4611f3c376f7a3c519e741809dd1538c0e90c902 Mon Sep 17 00:00:00 2001 From: SmartRootsSrl Date: Wed, 27 May 2026 18:45:39 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20add=20=3Fsave=3Dtrue=20param=20to=20cha?= =?UTF-8?q?rt=20v2=20=E2=80=94=20saves=20JPEG=20to=20disk=20(ChartSettings?= =?UTF-8?q?=20paths=20in=20appsettings)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ChartController.cs | 52 +++++++++++++++++-- CertReports.Syncfusion/appsettings.json | 4 ++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/CertReports.Syncfusion/Controllers/ChartController.cs b/CertReports.Syncfusion/Controllers/ChartController.cs index 2e42c20..26faa88 100644 --- a/CertReports.Syncfusion/Controllers/ChartController.cs +++ b/CertReports.Syncfusion/Controllers/ChartController.cs @@ -22,15 +22,18 @@ public class ChartController : ControllerBase private readonly IChartDataService _chartDataService; private readonly IChartDataServiceV2 _chartDataServiceV2; private readonly ILogger _logger; + private readonly IConfiguration _configuration; public ChartController( IChartDataService chartDataService, IChartDataServiceV2 chartDataServiceV2, - ILogger logger) + ILogger logger, + IConfiguration configuration) { _chartDataService = chartDataService; _chartDataServiceV2 = chartDataServiceV2; _logger = logger; + _configuration = configuration; } [HttpGet("{isin}")] @@ -91,7 +94,8 @@ public class ChartController : ControllerBase string isin, [FromQuery] int width = 1100, [FromQuery] int height = 700, - [FromQuery] string format = "png") + [FromQuery] string format = "png", + [FromQuery] bool save = false) { if (string.IsNullOrWhiteSpace(isin)) return BadRequest("ISIN non valido."); @@ -117,8 +121,17 @@ public class ChartController : ControllerBase || format.Equals("jpg", StringComparison.OrdinalIgnoreCase) || format.Equals("jpeg", StringComparison.OrdinalIgnoreCase); + // Alias codificato (necessario sia per jpgEnc che per il salvataggio su disco) + string? alias = isJpegEnc ? await _chartDataServiceV2.GetChartAliasAsync(isin) : null; + byte[] imgBytes = SkiaChartRendererV2.RenderToPng(chartData, width, height, jpeg: isJpeg); + // ── Salvataggio su disco (solo se ?save=true) ───────────────── + if (save && isJpeg) + { + await SaveChartToDiskAsync(isin, alias, imgBytes, isJpegEnc); + } + if (format.Equals("pdf", StringComparison.OrdinalIgnoreCase)) { byte[] pdfBytes = WrapPngInPdf(imgBytes); @@ -128,8 +141,6 @@ public class ChartController : ControllerBase if (isJpegEnc) { - // Nome file codificato da SP rpt_CertificatesChartsAlias (come vecchio jpgEnc DevExpress) - string? alias = await _chartDataServiceV2.GetChartAliasAsync(isin); string fileName = string.IsNullOrEmpty(alias) ? $"chart_v2_{isin}" : alias; Response.Headers.Append("Content-Disposition", $"inline; filename={fileName}.jpg"); return File(imgBytes, "image/jpeg"); @@ -151,6 +162,39 @@ public class ChartController : ControllerBase } } + /// + /// Salva il JPEG su disco nei percorsi configurati in appsettings.json (ChartSettings). + /// format=jpg/jpeg → SavePath/{isin}.jpg + /// format=jpgEnc → SavePathEnc/{alias}.jpg + /// Errori di I/O vengono loggati senza interrompere la risposta HTTP. + /// + private async Task SaveChartToDiskAsync(string isin, string? alias, byte[] imgBytes, bool isEnc) + { + try + { + string key = isEnc ? "ChartSettings:SavePathEnc" : "ChartSettings:SavePath"; + string? folder = _configuration[key]; + if (string.IsNullOrEmpty(folder)) + { + _logger.LogWarning("Salvataggio grafico saltato: chiave {Key} non configurata in appsettings", key); + return; + } + + Directory.CreateDirectory(folder); + + string fileName = isEnc && !string.IsNullOrEmpty(alias) ? $"{alias}.jpg" : $"{isin}.jpg"; + string fullPath = Path.Combine(folder, fileName); + + await System.IO.File.WriteAllBytesAsync(fullPath, imgBytes); + _logger.LogInformation("Grafico salvato su disco: {Path}", fullPath); + } + catch (Exception ex) + { + _logger.LogWarning(ex, "Impossibile salvare il grafico su disco per {Isin}", isin); + } + } + + private static byte[] WrapPngInPdf(byte[] pngBytes) { var doc = new PdfDocument(); diff --git a/CertReports.Syncfusion/appsettings.json b/CertReports.Syncfusion/appsettings.json index a076f41..7b9e495 100644 --- a/CertReports.Syncfusion/appsettings.json +++ b/CertReports.Syncfusion/appsettings.json @@ -29,5 +29,9 @@ } } }, + "ChartSettings": { + "SavePath": "C:\\inetpub\\wwwroot\\smart-roots.net\\Images\\Charts", + "SavePathEnc": "C:\\inetpub\\wwwroot\\smart-roots.net\\Images\\Charts\\encoded" + }, "AllowedHosts": "*" }