Refactor ASObjectConverter
This commit is contained in:
parent
6055a4604e
commit
8dc044d428
4 changed files with 37 additions and 43 deletions
|
@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue