Files
Pf2eDataScrapper/Pf2eViewer/EntityConventor.cs
T
2025-04-18 17:32:23 +04:00

82 lines
2.1 KiB
C#

using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Pf2eModel.Model;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Structure;
namespace Pf2eViewer;
internal class EntityConventor : JsonConverter
{
private Pf2eDbContext Context = new();
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Entity) || objectType.IsAssignableTo(typeof(IEntity));
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
JToken token = JToken.FromObject(value!);
if (token.Type != JTokenType.Object)
{
token.WriteTo(writer);
return;
}
JObject obj = (JObject) token;
switch (value)
{
case Entity e:
obj = ProcessEntity(obj, e);
break;
}
obj.WriteTo(writer);
}
JObject ProcessEntity(JObject obj, Entity e)
{
List<int> traitIds = e.Traits.Select(t => t.Id).ToList();
List<Trait> traits = Context.Traits.Where(t => traitIds.Contains(t.Id)).Include(t => t.Entity).ToList();
foreach (JToken item in (JArray) obj.SelectToken("Traits"))
{
JObject o = (JObject) item;
int id = o.SelectToken("Id").ToObject<int>();
o.Add("Name", traits.FirstOrDefault(t => t.Id == id)!.Entity.Name);
}
obj.Remove("Description");
return obj;
}
public override bool CanRead => false;
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}
private abstract class Conventer<T>(JsonWriter writer, T value, JsonSerializer serializer, Pf2eDbContext context)
{
public JsonWriter Writer { get; } = writer;
public T Value { get; } = value;
public JsonSerializer Serializer { get; } = serializer;
public Pf2eDbContext Context { get; } = context;
public abstract JObject Process();
}
}