Программа просмотра базы данных
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
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<Newtonsoft.Json.JsonWriter, object, Newtonsoft.Json.JsonSerializer, Pf2eModel.Model.Pf2eDbContext, Newtonsoft.Json.Linq.JObject>;
|
||||
|
||||
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<int>();
|
||||
|
||||
o.Add("Name", traits.FirstOrDefault(t => t.Id == id)!.Entity.Name);
|
||||
}
|
||||
|
||||
obj.Remove("Description");
|
||||
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private JArray GetFromSet<T>(DbSet<T> set, Func<T, bool> 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<EntityAlias>(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<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();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user