[backend/federation] Parse paginated collections correctly

This commit by itself will break parsing Mastodon Notes, since they
inline a CollectionPage without an ID, which Iceshrimp.NET can't cope
with.
This commit is contained in:
Kopper 2024-09-13 15:05:28 +03:00 committed by Laura Hausmann
parent 8c1a635027
commit 481bd423b3
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
3 changed files with 19 additions and 34 deletions

View file

@ -31,12 +31,12 @@ public class ASCollection : ASObject
public ASLink? Current { get; set; } public ASLink? Current { get; set; }
[J($"{Constants.ActivityStreamsNs}#first")] [J($"{Constants.ActivityStreamsNs}#first")]
[JC(typeof(ASLinkConverter))] [JC(typeof(ASCollectionPageConverter))]
public ASLink? First { get; set; } public ASCollectionPage? First { get; set; }
[J($"{Constants.ActivityStreamsNs}#last")] [J($"{Constants.ActivityStreamsNs}#last")]
[JC(typeof(ASLinkConverter))] [JC(typeof(ASCollectionPageConverter))]
public ASLink? Last { get; set; } public ASCollectionPage? Last { get; set; }
public new bool IsUnresolved => !TotalItems.HasValue; public new bool IsUnresolved => !TotalItems.HasValue;
} }

View file

@ -27,16 +27,16 @@ public class ASCollectionPage : ASObject
public ulong? TotalItems { get; set; } public ulong? TotalItems { get; set; }
[J($"{Constants.ActivityStreamsNs}#partOf")] [J($"{Constants.ActivityStreamsNs}#partOf")]
[JC(typeof(ASLinkConverter))] [JC(typeof(ASCollectionConverter))]
public ASLink? PartOf { get; set; } public ASCollection? PartOf { get; set; }
[J($"{Constants.ActivityStreamsNs}#prev")] [J($"{Constants.ActivityStreamsNs}#prev")]
[JC(typeof(ASLinkConverter))] [JC(typeof(ASCollectionPageConverter))]
public ASLink? Prev { get; set; } public ASCollectionPage? Prev { get; set; }
[J($"{Constants.ActivityStreamsNs}#next")] [J($"{Constants.ActivityStreamsNs}#next")]
[JC(typeof(ASLinkConverter))] [JC(typeof(ASCollectionPageConverter))]
public ASLink? Next { get; set; } public ASCollectionPage? Next { get; set; }
} }
public sealed class ASCollectionPageConverter : JsonConverter public sealed class ASCollectionPageConverter : JsonConverter
@ -56,9 +56,6 @@ public sealed class ASCollectionPageConverter : JsonConverter
if (reader.TokenType == JsonToken.StartArray) if (reader.TokenType == JsonToken.StartArray)
{ {
var obj = JArray.Load(reader); var obj = JArray.Load(reader);
var valueList = obj.ToObject<List<LDValueObject<object?>>>();
if (valueList is { Count: > 0 })
return VC.HandleObject(valueList[0], objectType);
var list = obj.ToObject<List<ASCollectionPage?>>(); var list = obj.ToObject<List<ASCollectionPage?>>();
return list == null || list.Count == 0 ? null : list[0]; return list == null || list.Count == 0 ? null : list[0];
} }

View file

@ -8,9 +8,9 @@ using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectCo
namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types;
public class ASOrderedCollectionPage : ASObject public class ASOrderedCollectionPage : ASCollectionPage
{ {
public const string ObjectType = $"{Constants.ActivityStreamsNs}#OrderedCollectionPage"; public new const string ObjectType = $"{Constants.ActivityStreamsNs}#OrderedCollectionPage";
[JsonConstructor] [JsonConstructor]
public ASOrderedCollectionPage(bool withType = true) => Type = withType ? ObjectType : null; public ASOrderedCollectionPage(bool withType = true) => Type = withType ? ObjectType : null;
@ -19,24 +19,12 @@ public class ASOrderedCollectionPage : ASObject
public ASOrderedCollectionPage(string id, bool withType = false) : this(withType) => Id = id; public ASOrderedCollectionPage(string id, bool withType = false) : this(withType) => Id = id;
[J($"{Constants.ActivityStreamsNs}#items")] [J($"{Constants.ActivityStreamsNs}#items")]
[JC(typeof(ASCollectionItemsConverter))] [JC(typeof(ASOrderedCollectionItemsConverter))]
public List<ASObject>? Items { get; set; } public new List<ASObject>? Items
{
[J($"{Constants.ActivityStreamsNs}#totalItems")] get => base.Items;
[JC(typeof(VC))] set => base.Items = value;
public ulong? TotalItems { get; set; } }
[J($"{Constants.ActivityStreamsNs}#partOf")]
[JC(typeof(ASLinkConverter))]
public ASLink? PartOf { get; set; }
[J($"{Constants.ActivityStreamsNs}#prev")]
[JC(typeof(ASLinkConverter))]
public ASLink? Prev { get; set; }
[J($"{Constants.ActivityStreamsNs}#next")]
[JC(typeof(ASLinkConverter))]
public ASLink? Next { get; set; }
} }
public sealed class ASOrderedCollectionPageConverter : JsonConverter public sealed class ASOrderedCollectionPageConverter : JsonConverter