using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Pf2eModel; using Pf2eModel.Model; using Pf2eModel.Model.Base; using Pf2eModel.Model.Structure; using Processor = System.Func; 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) { var traitIds = e.Traits.Select(t => t.Id).ToList(); var traits = Context.Traits.Where(t => traitIds.Contains(t.Id)).Include(t => t.Entity).ToList(); foreach (var item in (JArray) obj.SelectToken("Traits")) { JObject o = (JObject) item; int id = o.SelectToken("Id").ToObject(); o.Add("Name", traits.FirstOrDefault(t => t.Id == id)!.Entity.Name); } obj.Remove("Description"); return obj; } private JArray GetFromSet(DbSet set, Func where) where T : Type { return new(set.Where(where).Select(JToken.FromObject).ToArray()); } private JObject Process(JsonWriter writer, Entity e, JsonSerializer serializer) { JObject result = new(); // result.Add("Aliases", GetFromSet(context.EntityAliases, o => o.Entity == e)); result.Add("Sources", new JArray(e.Sources.Select(o => JToken.FromObject(o)).ToArray())); result.Add("Keywords", new JArray(e.Keywords.Select(o => JToken.FromObject(o)).ToArray())); result.Add("Externals", new JArray(e.Externals.Select(o => JToken.FromObject(o)).ToArray())); result.Add("Traits", new JArray(e.Traits.Select(o => JToken.FromObject(o)).ToArray())); return result; } 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(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(); } }