Add loadable fields handling on system.text.json serializer

This commit is contained in:
Zoe Roux 2024-03-22 23:04:07 +01:00
parent ec6b90b33c
commit d62bdfc637
No known key found for this signature in database
2 changed files with 27 additions and 1 deletions

View File

@ -95,8 +95,11 @@ namespace Kyoo.Core
})
.AddJsonOptions(x =>
{
x.JsonSerializerOptions.TypeInfoResolver = new WithKindResolver()
{
Modifiers = { WithKindResolver.HandleLoadableFields }
};
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
x.JsonSerializerOptions.TypeInfoResolver = new WithKindResolver();
x.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
})
.AddDataAnnotations()

View File

@ -18,10 +18,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using Kyoo.Abstractions.Models;
using Kyoo.Abstractions.Models.Attributes;
using Microsoft.AspNetCore.Http;
using static System.Text.Json.JsonNamingPolicy;
namespace Kyoo.Core.Api;
@ -53,4 +56,24 @@ public class WithKindResolver : DefaultJsonTypeInfoResolver
return jsonTypeInfo;
}
private static readonly IHttpContextAccessor _accessor = new HttpContextAccessor();
public static void HandleLoadableFields(JsonTypeInfo info)
{
foreach (JsonPropertyInfo prop in info.Properties)
{
object[] attributes =
prop.AttributeProvider?.GetCustomAttributes(typeof(LoadableRelationAttribute), true)
?? Array.Empty<object>();
if (attributes.FirstOrDefault() is not LoadableRelationAttribute relation)
continue;
prop.ShouldSerialize = (_, _) =>
{
if (_accessor?.HttpContext?.Items["fields"] is not ICollection<string> fields)
return false;
return fields.Contains(prop.Name, StringComparer.InvariantCultureIgnoreCase);
};
}
}
}