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
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 response = await client.SendAsync(request);
var input = await response.Content.ReadAsStringAsync();
var json = JsonConvert.DeserializeObject<JObject?>(input, JsonSerializerSettings);
var res = LdHelpers.Expand(json);
if (res == null) throw new Exception("Failed to expand JSON-LD object");
return res;
var res = LdHelpers.Expand(json) ?? throw new Exception("Failed to expand JSON-LD object");
return res.Select(p => p.ToObject<ASObject>(new JsonSerializer { Converters = { new ASObjectConverter() } }) ??
throw new Exception("Failed to deserialize activity"));
}
public async Task<ASActor> FetchActor(string uri) {
var activity = await FetchActivity(uri);
var actor = activity.ToObject<List<ASActor>>();
return actor?.First() ?? throw new Exception("Failed to fetch actor");
return activity.OfType<ASActor>().FirstOrDefault() ?? 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 VDS.RDF;
using VDS.RDF.JsonLd;
using VDS.RDF.Parsing;
using VDS.RDF.Writing.Formatting;
namespace Iceshrimp.Backend.Core.Federation.ActivityStreams;

View file

@ -11,35 +11,8 @@ public class ASActivity : ASObject {
public ASActor? Actor { get; set; }
[J("https://www.w3.org/ns/activitystreams#object")]
[JC(typeof(ASActivityObjectConverter))]
[JC(typeof(ASObjectConverter))]
public ASObject? Object { get; set; }
}
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 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();
}
}