[backend/configuration] Add config validation for the image processing pipeline

This commit is contained in:
Laura Hausmann 2024-08-08 19:34:18 +02:00
parent e40cd7dbfd
commit e379ff3f60
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 50 additions and 3 deletions

View file

@ -198,7 +198,7 @@ public sealed class Config
public bool DisableValidation { get; init; } = false;
}
public sealed class MediaProcessingSection
public sealed class MediaProcessingSection : IValidatableObject
{
public ImagePipelineSection ImagePipeline { get; init; } = new();
@ -242,6 +242,43 @@ public sealed class Config
};
}
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
List<ValidationResult> res = [];
if (ImageProcessor == Enums.ImageProcessor.None) return res;
List<ImageFormatConfiguration> formats =
[
ImagePipeline.Thumbnail.Local,
ImagePipeline.Thumbnail.Remote,
ImagePipeline.Original.Local,
ImagePipeline.Original.Remote,
ImagePipeline.Public.Local,
ImagePipeline.Public.Remote
];
if (ImageProcessor == Enums.ImageProcessor.ImageSharp)
{
// @formatter:off
if (formats.Any(p => p.Format is ImageFormatEnum.Avif or ImageFormatEnum.Jxl))
return [new ValidationResult("ImageSharp does not support AVIF or JXL. Please choose a different format, or switch to LibVips.")];
// @formatter:on
}
// @formatter:off
if (ImagePipeline.Original.Local.Format == ImageFormatEnum.None || ImagePipeline.Original.Remote.Format == ImageFormatEnum.None)
return [new ValidationResult("The image format 'None' is not valid for original image versions. Please choose a different format.")];
// @formatter:on
formats.ForEach(p =>
{
var context = new ValidationContext(p);
Validator.TryValidateObject(p, context, res, true);
});
return res;
}
}
public sealed class ImagePipelineSection
@ -317,4 +354,4 @@ public sealed class Config
[Range(0, int.MaxValue)] public int Completed { get; init; } = 100;
[Range(0, int.MaxValue)] public int Failed { get; init; } = 10;
}
}
}

View file

@ -128,6 +128,7 @@ public static class ServiceExtensions
public static void ConfigureServices(this IServiceCollection services, IConfiguration configuration)
{
// @formatter:off
services.ConfigureWithValidation<Config>(configuration)
.ConfigureWithValidation<Config.InstanceSection>(configuration, "Instance")
.ConfigureWithValidation<Config.SecuritySection>(configuration, "Security")
@ -138,7 +139,16 @@ public static class ServiceExtensions
.ConfigureWithValidation<Config.DatabaseSection>(configuration, "Database")
.ConfigureWithValidation<Config.StorageSection>(configuration, "Storage")
.ConfigureWithValidation<Config.LocalStorageSection>(configuration, "Storage:Local")
.ConfigureWithValidation<Config.ObjectStorageSection>(configuration, "Storage:ObjectStorage");
.ConfigureWithValidation<Config.ObjectStorageSection>(configuration, "Storage:ObjectStorage")
.ConfigureWithValidation<Config.MediaProcessingSection>(configuration, "Storage:MediaProcessing")
.ConfigureWithValidation<Config.ImagePipelineSection>(configuration, "Storage:MediaProcessing:ImagePipeline")
.ConfigureWithValidation<Config.ImageFormatConfiguration>(configuration, "Storage:MediaProcessing:ImagePipeline:Original:Local")
.ConfigureWithValidation<Config.ImageFormatConfiguration>(configuration, "Storage:MediaProcessing:ImagePipeline:Original:Remote")
.ConfigureWithValidation<Config.ImageFormatConfiguration>(configuration, "Storage:MediaProcessing:ImagePipeline:Thumbnail:Local")
.ConfigureWithValidation<Config.ImageFormatConfiguration>(configuration, "Storage:MediaProcessing:ImagePipeline:Thumbnail:Remote")
.ConfigureWithValidation<Config.ImageFormatConfiguration>(configuration, "Storage:MediaProcessing:ImagePipeline:Public:Local")
.ConfigureWithValidation<Config.ImageFormatConfiguration>(configuration, "Storage:MediaProcessing:ImagePipeline:Public:Remote");
// @formatter:on
services.Configure<JsonOptions>(options =>
{