diff --git a/src/Helpers/ImageHelper.cs b/src/Helpers/ImageHelper.cs index adc5651..0f9cece 100644 --- a/src/Helpers/ImageHelper.cs +++ b/src/Helpers/ImageHelper.cs @@ -1,6 +1,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Webp; using SixLabors.ImageSharp.Formats; +using Berufsschule_HAM.Models; namespace Berufsschule_HAM.Helpers; @@ -35,4 +36,20 @@ public static class ImageHelper } return result; } + + public static async Task PreloadUsers(IEnumerable userModels, UserImagePreloadType? preloadType) + { + if (preloadType is null || preloadType == UserImagePreloadType.None) return; + + foreach (UserModel user in userModels) + { + Console.WriteLine(user.Cn); + if (user.JpegPhoto is null) continue; + ResizeAndConvertToWebp(user.JpegPhoto, 48); + if (preloadType == UserImagePreloadType.FullSized) + { + ResizeAndConvertToWebp(user.JpegPhoto, 256); + } + } + } } \ No newline at end of file diff --git a/src/Models/AdminSettingsModel.cs b/src/Models/AdminSettingsModel.cs index 39d2620..a15ecc6 100644 --- a/src/Models/AdminSettingsModel.cs +++ b/src/Models/AdminSettingsModel.cs @@ -11,9 +11,17 @@ public class AdminSettingsModel public required string BarcodeText { get; set; } public required Dictionary Presets { get; set; } public HashAlgorithm? hashAlgorithm; + public UserImagePreloadType? UserImagePreloadType { get; set; } = Models.UserImagePreloadType.None; } public class Preset { public required Dictionary Attribute { get; set; } +} + +public enum UserImagePreloadType +{ + None, + Icons, + FullSized } \ No newline at end of file diff --git a/src/Program.cs b/src/Program.cs index 8096252..2a2695b 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -34,6 +34,7 @@ builder.Services.AddElmah(Options => builder.Services.AddSingleton(); builder.Services.AddHostedService(); +builder.Services.AddHostedService(); builder.Services.AddHealthChecks() .AddCheck("DatabaseHealthCheck"); diff --git a/src/Resources/Views.Settings.Admin.resx b/src/Resources/Views.Settings.Admin.de.resx similarity index 83% rename from src/Resources/Views.Settings.Admin.resx rename to src/Resources/Views.Settings.Admin.de.resx index 1915c86..5f9ba22 100644 --- a/src/Resources/Views.Settings.Admin.resx +++ b/src/Resources/Views.Settings.Admin.de.resx @@ -88,4 +88,17 @@ Fehler bei der Kommunikation mit dem Server + + + Benutzerprofilbilder im Voraus laden + + + Benutzerprofilbilder nicht laden + + + 48x48 (empfohlen) + + + 48x48 + 256x256 + diff --git a/src/Resources/Views.Settings.Admin.en.resx b/src/Resources/Views.Settings.Admin.en.resx new file mode 100644 index 0000000..591c656 --- /dev/null +++ b/src/Resources/Views.Settings.Admin.en.resx @@ -0,0 +1,25 @@ + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, ... + + + System.Resources.ResXResourceWriter, System.Windows.Forms, ... + + + + Do not preload user images + + + 48x48 (recommended) + + + 48x48 + 256x256 + + diff --git a/src/Services/ImagePreloadService.cs b/src/Services/ImagePreloadService.cs new file mode 100644 index 0000000..0a3b2d3 --- /dev/null +++ b/src/Services/ImagePreloadService.cs @@ -0,0 +1,33 @@ +using Berufsschule_HAM.Models; +using Berufsschule_HAM.Helpers; + +namespace Berufsschule_HAM.Services; + +public class ImagePreloadService : IHostedService +{ + private readonly LdapService _ldap; + private readonly ILogger _logger; + public ImagePreloadService(LdapService ldap, ILogger logger) + { + _ldap = ldap ?? throw new ArgumentNullException(nameof(ldap)); + _logger = logger; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + AdminSettingsModel adminSettingsModel = _ldap.GetAdminSettingsModelAsync().Result; + + if (adminSettingsModel.UserImagePreloadType is not null && adminSettingsModel.UserImagePreloadType != UserImagePreloadType.None) + { + IEnumerable users = _ldap.ListUsersAsync().Result; + _logger.LogTrace("Preloading user images"); + return ImageHelper.PreloadUsers(users, adminSettingsModel.UserImagePreloadType); + } + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/Views/Settings/Admin.cshtml b/src/Views/Settings/Admin.cshtml index 1910674..1cff310 100644 --- a/src/Views/Settings/Admin.cshtml +++ b/src/Views/Settings/Admin.cshtml @@ -56,6 +56,15 @@ +
+ + +