From c3000bdbc546670e1001d608c0f7541e7af64187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20J=C3=B8rgen=20Skogstad?= Date: Fri, 7 Jun 2024 13:08:41 +0200 Subject: [PATCH] feat: Front channel embeds (#792) ## Description ## Related Issue(s) - #329 ## Verification - [x] **Your** code builds clean without any errors or warnings - [x] Manual testing done (required) - [ ] Relevant automated test added (if you find this hard, leave it and we'll help out) ## Documentation - [ ] Documentation is updated (either in `docs`-directory, Altinnpedia or a separate linked PR in [altinn-studio-docs.](https://github.com/Altinn/altinn-studio-docs), if applicable) Co-authored-by: Knut Haug --- .../Create/CreateDialogCommandValidator.cs | 6 +++ .../Update/UpdateDialogCommandValidator.cs | 5 +++ .../MediaTypes.cs | 45 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/Digdir.Domain.Dialogporten.Domain/MediaTypes.cs diff --git a/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Create/CreateDialogCommandValidator.cs b/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Create/CreateDialogCommandValidator.cs index e8a055309..ec855cdc3 100644 --- a/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Create/CreateDialogCommandValidator.cs +++ b/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Create/CreateDialogCommandValidator.cs @@ -1,6 +1,7 @@ using Digdir.Domain.Dialogporten.Application.Common.Extensions.Enumerables; using Digdir.Domain.Dialogporten.Application.Common.Extensions.FluentValidation; using Digdir.Domain.Dialogporten.Application.Features.V1.Common.Localizations; +using Digdir.Domain.Dialogporten.Domain; using Digdir.Domain.Dialogporten.Domain.Common; using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Actions; using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Content; @@ -171,6 +172,11 @@ public CreateDialogDialogElementUrlDtoValidator() .MaximumLength(Constants.DefaultMaxUriLength); RuleFor(x => x.MediaType) .MaximumLength(Constants.DefaultMaxStringLength); + RuleFor(x => x.MediaType) + .Must(MediaTypes.IsValid!) + .When(x => x.MediaType != null) + .WithMessage("Invalid media type, see docs for complete list "); + RuleFor(x => x.ConsumerType) .IsInEnum(); } diff --git a/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Update/UpdateDialogCommandValidator.cs b/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Update/UpdateDialogCommandValidator.cs index 8e238c968..54c0aafa7 100644 --- a/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Update/UpdateDialogCommandValidator.cs +++ b/src/Digdir.Domain.Dialogporten.Application/Features/V1/ServiceOwner/Dialogs/Commands/Update/UpdateDialogCommandValidator.cs @@ -1,6 +1,7 @@ using Digdir.Domain.Dialogporten.Application.Common.Extensions.Enumerables; using Digdir.Domain.Dialogporten.Application.Common.Extensions.FluentValidation; using Digdir.Domain.Dialogporten.Application.Features.V1.Common.Localizations; +using Digdir.Domain.Dialogporten.Domain; using Digdir.Domain.Dialogporten.Domain.Common; using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Actions; using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Content; @@ -168,6 +169,10 @@ public UpdateDialogDialogElementUrlDtoValidator() .MaximumLength(Constants.DefaultMaxUriLength); RuleFor(x => x.MediaType) .MaximumLength(Constants.DefaultMaxStringLength); + RuleFor(x => x.MediaType) + .Must(MediaTypes.IsValid!) + .When(x => x.MediaType != null) + .WithMessage("Invalid media type, see docs for complete list "); RuleFor(x => x.ConsumerType) .IsInEnum(); } diff --git a/src/Digdir.Domain.Dialogporten.Domain/MediaTypes.cs b/src/Digdir.Domain.Dialogporten.Domain/MediaTypes.cs new file mode 100644 index 000000000..874818ae2 --- /dev/null +++ b/src/Digdir.Domain.Dialogporten.Domain/MediaTypes.cs @@ -0,0 +1,45 @@ +using System.Net.Mime; +using System.Reflection; + +namespace Digdir.Domain.Dialogporten.Domain; + +public static class MediaTypes +{ + // Custom MediaTypes for embedding content in frontend applications + private static readonly string[] CustomDialogportenMediaTypes = + [ + "application/vnd.dialogporten.frontchannelembed+json;type=markdown" + ]; + + private static string[]? _validMediaTypes; + + public static bool IsValid(string mediaType) => GetValidMediaTypes().Contains(mediaType); + + private static string[] GetValidMediaTypes() + { + if (_validMediaTypes != null) + { + return _validMediaTypes; + } + + var applicationMediaTypes = GetMediaTypes(typeof(MediaTypeNames.Application)); + var imageMediaTypes = GetMediaTypes(typeof(MediaTypeNames.Image)); + var textMediaTypes = GetMediaTypes(typeof(MediaTypeNames.Text)); + + _validMediaTypes = applicationMediaTypes + .Concat(imageMediaTypes) + .Concat(textMediaTypes) + .Concat(CustomDialogportenMediaTypes) + .ToArray(); + + return _validMediaTypes; + } + + private static IEnumerable GetMediaTypes(Type mediaTypeClass) + { + return mediaTypeClass + .GetFields(BindingFlags.Public | BindingFlags.Static) + .Where(field => field.FieldType == typeof(string)) + .Select(field => (string)field.GetValue(null)!); + } +}