Refactor ASObjectConverter

This commit is contained in:
Laura Hausmann 2024-01-20 22:25:41 +01:00
parent 6055a4604e
commit 8dc044d428
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
4 changed files with 37 additions and 43 deletions

View file

@ -10,22 +10,22 @@ namespace Iceshrimp.Backend.Core.Federation.ActivityPub;
//TODO: enforce @type values //TODO: enforce @type values
public class ActivityPubService(HttpClient client, HttpRequestService httpRqSvc) { public class ActivityPubService(HttpClient client, HttpRequestService httpRqSvc) {
private static readonly JsonSerializerSettings JsonSerializerSettings = new() { DateParseHandling = DateParseHandling.None }; private static readonly JsonSerializerSettings JsonSerializerSettings =
new() { DateParseHandling = DateParseHandling.None };
public async Task<JArray> FetchActivity(string url) { public async Task<IEnumerable<ASObject>> FetchActivity(string url) {
var request = httpRqSvc.Get(url, ["application/activity+json"]); var request = httpRqSvc.Get(url, ["application/activity+json"]);
var response = await client.SendAsync(request); var response = await client.SendAsync(request);
var input = await response.Content.ReadAsStringAsync(); var input = await response.Content.ReadAsStringAsync();
var json = JsonConvert.DeserializeObject<JObject?>(input, JsonSerializerSettings); var json = JsonConvert.DeserializeObject<JObject?>(input, JsonSerializerSettings);
var res = LdHelpers.Expand(json); var res = LdHelpers.Expand(json) ?? throw new Exception("Failed to expand JSON-LD object");
if (res == null) throw new Exception("Failed to expand JSON-LD object"); return res.Select(p => p.ToObject<ASObject>(new JsonSerializer { Converters = { new ASObjectConverter() } }) ??
return res; throw new Exception("Failed to deserialize activity"));
} }
public async Task<ASActor> FetchActor(string uri) { public async Task<ASActor> FetchActor(string uri) {
var activity = await FetchActivity(uri); var activity = await FetchActivity(uri);
var actor = activity.ToObject<List<ASActor>>(); return activity.OfType<ASActor>().FirstOrDefault() ?? throw new Exception("Failed to fetch actor");
return actor?.First() ?? throw new Exception("Failed to fetch actor");
} }
} }

View file

@ -1,12 +1,5 @@
using System.Collections;
using System.Globalization;
using Iceshrimp.Backend.Core.Helpers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using VDS.RDF;
using VDS.RDF.JsonLd; using VDS.RDF.JsonLd;
using VDS.RDF.Parsing;
using VDS.RDF.Writing.Formatting;
namespace Iceshrimp.Backend.Core.Federation.ActivityStreams; namespace Iceshrimp.Backend.Core.Federation.ActivityStreams;

View file

@ -11,35 +11,8 @@ public class ASActivity : ASObject {
public ASActor? Actor { get; set; } public ASActor? Actor { get; set; }
[J("https://www.w3.org/ns/activitystreams#object")] [J("https://www.w3.org/ns/activitystreams#object")]
[JC(typeof(ASActivityObjectConverter))] [JC(typeof(ASObjectConverter))]
public ASObject? Object { get; set; } public ASObject? Object { get; set; }
} }
public sealed class ASActivityConverter : ASSerializer.ListSingleObjectConverter<ASActivity>; public sealed class ASActivityConverter : ASSerializer.ListSingleObjectConverter<ASActivity>;
internal sealed class ASActivityObjectConverter : JsonConverter {
public override bool CanWrite => false;
public override bool CanConvert(Type objectType) {
return true;
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue,
JsonSerializer serializer) {
if (reader.TokenType == JsonToken.StartArray) {
var obj = JArray.Load(reader);
return ASObject.Deserialize(obj[0]);
}
if (reader.TokenType == JsonToken.StartObject) {
var obj = JObject.Load(reader);
return ASObject.Deserialize(obj);
}
throw new Exception("this shouldn't happen");
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) {
throw new NotImplementedException();
}
}

View file

@ -1,3 +1,4 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using J = Newtonsoft.Json.JsonPropertyAttribute; using J = Newtonsoft.Json.JsonPropertyAttribute;
@ -25,3 +26,30 @@ public class ASObject {
}; };
} }
} }
internal sealed class ASObjectConverter : JsonConverter {
public override bool CanWrite => false;
public override bool CanConvert(Type objectType) {
return true;
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue,
JsonSerializer serializer) {
if (reader.TokenType == JsonToken.StartArray) {
var obj = JArray.Load(reader);
return ASObject.Deserialize(obj[0]);
}
if (reader.TokenType == JsonToken.StartObject) {
var obj = JObject.Load(reader);
return ASObject.Deserialize(obj);
}
throw new Exception("this shouldn't happen");
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) {
throw new NotImplementedException();
}
}