feat: add FundReportOrchestrator (anagrafica + chart + merge + cache)

This commit is contained in:
2026-06-08 17:49:59 +02:00
parent 5347424e42
commit 461cffa442

View File

@@ -0,0 +1,70 @@
using CertReports.Syncfusion.Models;
using CertReports.Syncfusion.Services.Interfaces;
using Syncfusion.Pdf;
namespace CertReports.Syncfusion.Services.Implementations;
public class FundReportOrchestrator : IFundReportOrchestrator
{
private readonly IFundDataService _dataService;
private readonly FundAnagraficaRenderer _anagraficaRenderer;
private readonly FundChartSectionRenderer _chartRenderer;
private readonly IPdfMergerService _merger;
private readonly IPdfCacheService _cache;
private readonly ILogger<FundReportOrchestrator> _logger;
public FundReportOrchestrator(
IFundDataService dataService,
FundAnagraficaRenderer anagraficaRenderer,
FundChartSectionRenderer chartRenderer,
IPdfMergerService merger,
IPdfCacheService cache,
ILogger<FundReportOrchestrator> logger)
{
_dataService = dataService;
_anagraficaRenderer = anagraficaRenderer;
_chartRenderer = chartRenderer;
_merger = merger;
_cache = cache;
_logger = logger;
}
public async Task<byte[]> GenerateReportAsync(string isin, bool showBranding = false)
{
var cacheKey = showBranding ? $"fund:{isin}:branded" : $"fund:{isin}";
var cached = _cache.Get(cacheKey);
if (cached != null)
{
_logger.LogInformation("Fund report per {Isin} servito da cache ({Size} bytes)", isin, cached.Length);
return cached;
}
_logger.LogInformation("Generazione fund report per {Isin}", isin);
var info = await _dataService.GetFundInfoAsync(isin);
if (info == null)
throw new InvalidOperationException($"Nessun dato trovato per ISIN {isin}");
var reportData = new FundReportData { Info = info, ShowBranding = showBranding };
var sections = new List<PdfDocument>();
sections.Add(_anagraficaRenderer.Render(reportData));
_logger.LogInformation("Sezione 'FundAnagrafica' generata per {Isin}", isin);
var chartDoc = await _chartRenderer.RenderAsync(isin, info.Strumento);
if (chartDoc != null)
{
sections.Add(chartDoc);
_logger.LogInformation("Sezione 'FundChart' generata per {Isin}", isin);
}
else
{
_logger.LogWarning("Sezione 'FundChart' omessa per {Isin} (dati insufficienti o errore)", isin);
}
var finalPdf = _merger.Merge(sections);
_cache.Set(cacheKey, finalPdf);
_logger.LogInformation("Fund report generato per {Isin}: {Size} bytes", isin, finalPdf.Length);
return finalPdf;
}
}