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