From 8dc044d4280dbde4af4e9ed3744f1dfe0925e14e Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sat, 20 Jan 2024 22:25:41 +0100 Subject: [PATCH] Refactor ASObjectConverter --- .../ActivityPub/ActivityPubService.cs | 14 ++++----- .../Federation/ActivityStreams/LDHelpers.cs | 7 ----- .../ActivityStreams/Types/ASActivity.cs | 31 ++----------------- .../ActivityStreams/Types/ASObject.cs | 28 +++++++++++++++++ 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityPubService.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityPubService.cs index a95db114..f951a033 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityPubService.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityPubService.cs @@ -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 FetchActivity(string url) { + public async Task> 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(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(new JsonSerializer { Converters = { new ASObjectConverter() } }) ?? + throw new Exception("Failed to deserialize activity")); } public async Task FetchActor(string uri) { var activity = await FetchActivity(uri); - var actor = activity.ToObject>(); - return actor?.First() ?? throw new Exception("Failed to fetch actor"); + return activity.OfType().FirstOrDefault() ?? throw new Exception("Failed to fetch actor"); } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs index 06e92178..d07d72c6 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs @@ -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; diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs index 4766ef92..7ce84905 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs @@ -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; - -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(); - } -} \ No newline at end of file +public sealed class ASActivityConverter : ASSerializer.ListSingleObjectConverter; \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASObject.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASObject.cs index 2087acce..4c5a2421 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASObject.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASObject.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using J = Newtonsoft.Json.JsonPropertyAttribute; @@ -24,4 +25,31 @@ public class ASObject { _ => throw new ArgumentOutOfRangeException() }; } +} + +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(); + } } \ No newline at end of file