feat: add FundReportController (4 endpoint /api/report/fund/)

This commit is contained in:
2026-06-08 17:51:52 +02:00
parent 461cffa442
commit b3024f953d

View File

@@ -0,0 +1,115 @@
using CertReports.Syncfusion.Helpers;
using CertReports.Syncfusion.Services.Interfaces;
using Microsoft.AspNetCore.Mvc;
namespace CertReports.Syncfusion.Controllers;
/// <summary>
/// Endpoint:
/// GET /api/report/fund/by-isin/{isin}
/// GET /api/report/fund?p={isin_cifrato}
/// GET /api/report/fund?alias={id}
/// GET /api/report/fund/download?p={isin_cifrato}
/// </summary>
[ApiController]
[Route("api/report/fund")]
public class FundReportController : ControllerBase
{
private readonly IFundReportOrchestrator _orchestrator;
private readonly IFundDataService _dataService;
private readonly CryptoHelper _crypto;
private readonly ILogger<FundReportController> _logger;
public FundReportController(
IFundReportOrchestrator orchestrator,
IFundDataService dataService,
CryptoHelper crypto,
ILogger<FundReportController> logger)
{
_orchestrator = orchestrator;
_dataService = dataService;
_crypto = crypto;
_logger = logger;
}
[HttpGet("by-isin/{isin}")]
public async Task<IActionResult> ByIsin(string isin,
[FromQuery] bool branding = false)
=> await GenerateAndReturnPdf(isin, branding, inline: true);
[HttpGet("")]
public async Task<IActionResult> ByQuery(
[FromQuery] string? p = null,
[FromQuery] string? alias = null,
[FromQuery] bool branding = false)
{
string? isin = null;
if (!string.IsNullOrEmpty(p))
{
try { isin = _crypto.DecryptIsin(p); }
catch (Exception ex)
{
_logger.LogWarning(ex, "Errore decodifica ISIN cifrato (fund)");
return BadRequest("Parametro 'p' non valido.");
}
}
else if (!string.IsNullOrEmpty(alias))
{
isin = await _dataService.FindIsinByAliasIdAsync(alias);
}
if (string.IsNullOrEmpty(isin))
return BadRequest("Specificare 'p' (ISIN cifrato) o 'alias'.");
return await GenerateAndReturnPdf(isin, branding, inline: true);
}
[HttpGet("download")]
public async Task<IActionResult> Download(
[FromQuery] string? p = null,
[FromQuery] string? alias = null,
[FromQuery] bool branding = false)
{
string? isin = null;
if (!string.IsNullOrEmpty(p))
{
try { isin = _crypto.DecryptIsin(p); }
catch (Exception ex)
{
_logger.LogWarning(ex, "Errore decodifica ISIN cifrato (fund download)");
return BadRequest("Parametro 'p' non valido.");
}
}
else if (!string.IsNullOrEmpty(alias))
{
isin = await _dataService.FindIsinByAliasIdAsync(alias);
}
if (string.IsNullOrEmpty(isin))
return BadRequest("Specificare 'p' (ISIN cifrato) o 'alias'.");
return await GenerateAndReturnPdf(isin, branding, inline: false);
}
private async Task<IActionResult> GenerateAndReturnPdf(string isin, bool branding, bool inline)
{
try
{
var pdfBytes = await _orchestrator.GenerateReportAsync(isin, branding);
var disposition = inline ? "inline" : "attachment";
Response.Headers.Append("Content-Disposition",
$"{disposition}; filename=fund_{isin}.pdf");
return File(pdfBytes, "application/pdf");
}
catch (InvalidOperationException ex) when (ex.Message.Contains("Nessun dato"))
{
_logger.LogWarning("ISIN fondo non trovato: {Isin}", isin);
return NotFound($"Nessun dato per ISIN {isin}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Errore generazione fund report per ISIN {Isin}", isin);
return StatusCode(500, "Errore nella generazione del report.");
}
}
}