feat: add FundReportOrchestrator (anagrafica + chart + merge + cache)
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user