mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-30 19:54:16 -04:00
Add loadable fields handling on system.text.json serializer
This commit is contained in:
parent
ec6b90b33c
commit
d62bdfc637
@ -95,8 +95,11 @@ namespace Kyoo.Core
|
|||||||
})
|
})
|
||||||
.AddJsonOptions(x =>
|
.AddJsonOptions(x =>
|
||||||
{
|
{
|
||||||
|
x.JsonSerializerOptions.TypeInfoResolver = new WithKindResolver()
|
||||||
|
{
|
||||||
|
Modifiers = { WithKindResolver.HandleLoadableFields }
|
||||||
|
};
|
||||||
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
|
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
|
||||||
x.JsonSerializerOptions.TypeInfoResolver = new WithKindResolver();
|
|
||||||
x.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
x.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
||||||
})
|
})
|
||||||
.AddDataAnnotations()
|
.AddDataAnnotations()
|
||||||
|
@ -18,10 +18,13 @@
|
|||||||
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Text.Json.Serialization.Metadata;
|
using System.Text.Json.Serialization.Metadata;
|
||||||
using Kyoo.Abstractions.Models;
|
using Kyoo.Abstractions.Models;
|
||||||
|
using Kyoo.Abstractions.Models.Attributes;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
using static System.Text.Json.JsonNamingPolicy;
|
using static System.Text.Json.JsonNamingPolicy;
|
||||||
|
|
||||||
namespace Kyoo.Core.Api;
|
namespace Kyoo.Core.Api;
|
||||||
@ -53,4 +56,24 @@ public class WithKindResolver : DefaultJsonTypeInfoResolver
|
|||||||
|
|
||||||
return jsonTypeInfo;
|
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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user