feat(11-03): inject IBrandingService into all 5 export ViewModels and assemble branding in ExportHtmlAsync

- Add IBrandingService field and DI constructor parameter to all 5 ViewModels
- Add optional IBrandingService? parameter to test constructors (PermissionsViewModel, StorageViewModel, UserAccessAuditViewModel)
- Assemble ReportBranding from GetMspLogoAsync + _currentProfile.ClientLogo before each WriteAsync call
- Pass branding as last parameter to WriteAsync in all ExportHtmlAsync methods
- Guard clause: branding assembly skipped (branding = null) when _brandingService is null (test constructors)
- Build: 0 warnings, 0 errors; tests: 254 passed / 0 failed / 26 skipped
This commit is contained in:
Dev
2026-04-08 14:50:54 +02:00
parent e77455f03f
commit 816fb5e3b5
5 changed files with 70 additions and 9 deletions

View File

@@ -26,6 +26,7 @@ public partial class PermissionsViewModel : FeatureViewModelBase
private readonly ISessionManager _sessionManager;
private readonly CsvExportService? _csvExportService;
private readonly HtmlExportService? _htmlExportService;
private readonly IBrandingService? _brandingService;
private readonly ILogger<FeatureViewModelBase> _logger;
// ── Observable properties ───────────────────────────────────────────────
@@ -128,6 +129,7 @@ public partial class PermissionsViewModel : FeatureViewModelBase
ISessionManager sessionManager,
CsvExportService csvExportService,
HtmlExportService htmlExportService,
IBrandingService brandingService,
ILogger<FeatureViewModelBase> logger)
: base(logger)
{
@@ -136,6 +138,7 @@ public partial class PermissionsViewModel : FeatureViewModelBase
_sessionManager = sessionManager;
_csvExportService = csvExportService;
_htmlExportService = htmlExportService;
_brandingService = brandingService;
_logger = logger;
ExportCsvCommand = new AsyncRelayCommand(ExportCsvAsync, CanExport);
@@ -149,7 +152,8 @@ public partial class PermissionsViewModel : FeatureViewModelBase
IPermissionsService permissionsService,
ISiteListService siteListService,
ISessionManager sessionManager,
ILogger<FeatureViewModelBase> logger)
ILogger<FeatureViewModelBase> logger,
IBrandingService? brandingService = null)
: base(logger)
{
_permissionsService = permissionsService;
@@ -157,6 +161,7 @@ public partial class PermissionsViewModel : FeatureViewModelBase
_sessionManager = sessionManager;
_csvExportService = null;
_htmlExportService = null;
_brandingService = brandingService;
_logger = logger;
ExportCsvCommand = new AsyncRelayCommand(ExportCsvAsync, CanExport);
@@ -313,10 +318,18 @@ public partial class PermissionsViewModel : FeatureViewModelBase
if (dialog.ShowDialog() != true) return;
try
{
ReportBranding? branding = null;
if (_brandingService is not null)
{
var mspLogo = await _brandingService.GetMspLogoAsync();
var clientLogo = _currentProfile?.ClientLogo;
branding = new ReportBranding(mspLogo, clientLogo);
}
if (IsSimplifiedMode && SimplifiedResults.Count > 0)
await _htmlExportService.WriteAsync(SimplifiedResults.ToList(), dialog.FileName, CancellationToken.None);
await _htmlExportService.WriteAsync(SimplifiedResults.ToList(), dialog.FileName, CancellationToken.None, branding);
else
await _htmlExportService.WriteAsync(Results, dialog.FileName, CancellationToken.None);
await _htmlExportService.WriteAsync(Results, dialog.FileName, CancellationToken.None, branding);
OpenFile(dialog.FileName);
}
catch (Exception ex)