feat(11-04): add UpdateProfileAsync to ProfileService and ImportLogoFromBytesAsync to BrandingService
- ProfileService.UpdateProfileAsync: replaces profile by name and persists the change - IBrandingService: add ImportLogoFromBytesAsync to interface contract - BrandingService.ImportLogoFromBytesAsync: validates magic bytes, compresses if > 512KB, returns LogoData - BrandingService.ImportLogoAsync: refactored to delegate to ImportLogoFromBytesAsync - ProfileServiceTests: 2 new tests (UpdateProfileAsync happy path + KeyNotFoundException) - BrandingServiceTests: 2 new tests (ImportLogoFromBytesAsync valid PNG + invalid bytes) - Tests.csproj: suppress NU1701 for pre-existing LiveCharts2/OpenTK transitive warnings
This commit is contained in:
@@ -30,7 +30,15 @@ public class BrandingService : IBrandingService
|
||||
public async Task<LogoData> ImportLogoAsync(string filePath)
|
||||
{
|
||||
var bytes = await File.ReadAllBytesAsync(filePath);
|
||||
return await ImportLogoFromBytesAsync(bytes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates raw bytes as PNG or JPEG via magic bytes, auto-compresses if over 512 KB,
|
||||
/// and returns a LogoData record. Used when bytes are obtained from a stream (e.g. Entra branding API).
|
||||
/// </summary>
|
||||
public Task<LogoData> ImportLogoFromBytesAsync(byte[] bytes)
|
||||
{
|
||||
var mimeType = DetectMimeType(bytes);
|
||||
|
||||
if (bytes.Length > MaxSizeBytes)
|
||||
@@ -38,11 +46,11 @@ public class BrandingService : IBrandingService
|
||||
bytes = CompressToLimit(bytes, mimeType, MaxSizeBytes);
|
||||
}
|
||||
|
||||
return new LogoData
|
||||
return Task.FromResult(new LogoData
|
||||
{
|
||||
Base64 = Convert.ToBase64String(bytes),
|
||||
MimeType = mimeType
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
public async Task SaveMspLogoAsync(LogoData logo)
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace SharepointToolbox.Services;
|
||||
public interface IBrandingService
|
||||
{
|
||||
Task<LogoData> ImportLogoAsync(string filePath);
|
||||
Task<LogoData> ImportLogoFromBytesAsync(byte[] bytes);
|
||||
Task SaveMspLogoAsync(LogoData logo);
|
||||
Task ClearMspLogoAsync();
|
||||
Task<LogoData?> GetMspLogoAsync();
|
||||
|
||||
@@ -51,4 +51,13 @@ public class ProfileService
|
||||
profiles.Remove(target);
|
||||
await _repository.SaveAsync(profiles);
|
||||
}
|
||||
|
||||
public async Task UpdateProfileAsync(TenantProfile profile)
|
||||
{
|
||||
var profiles = (await _repository.LoadAsync()).ToList();
|
||||
var idx = profiles.FindIndex(p => p.Name == profile.Name);
|
||||
if (idx < 0) throw new KeyNotFoundException($"Profile '{profile.Name}' not found.");
|
||||
profiles[idx] = profile;
|
||||
await _repository.SaveAsync(profiles);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user