[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; }
[J($"{Constants.ActivityStreamsNs}#first")]
[JC(typeof(ASLinkConverter))]
public ASLink? First { get; set; }
[JC(typeof(ASCollectionPageConverter))]
public ASCollectionPage? First { get; set; }
[J($"{Constants.ActivityStreamsNs}#last")]
[JC(typeof(ASLinkConverter))]
public ASLink? Last { get; set; }
[JC(typeof(ASCollectionPageConverter))]
public ASCollectionPage? Last { get; set; }
public new bool IsUnresolved => !TotalItems.HasValue;
}

View file

@ -27,16 +27,16 @@ public class ASCollectionPage : ASObject
public ulong? TotalItems { get; set; }
[J($"{Constants.ActivityStreamsNs}#partOf")]
[JC(typeof(ASLinkConverter))]
public ASLink? PartOf { get; set; }
[JC(typeof(ASCollectionConverter))]
public ASCollection? PartOf { get; set; }
[J($"{Constants.ActivityStreamsNs}#prev")]
[JC(typeof(ASLinkConverter))]
public ASLink? Prev { get; set; }
[JC(typeof(ASCollectionPageConverter))]
public ASCollectionPage? Prev { get; set; }
[J($"{Constants.ActivityStreamsNs}#next")]
[JC(typeof(ASLinkConverter))]
public ASLink? Next { get; set; }
[JC(typeof(ASCollectionPageConverter))]
public ASCollectionPage? Next { get; set; }
}
public sealed class ASCollectionPageConverter : JsonConverter
@ -55,10 +55,7 @@ public sealed class ASCollectionPageConverter : JsonConverter
{
if (reader.TokenType == JsonToken.StartArray)
{
var obj = JArray.Load(reader);
var valueList = obj.ToObject<List<LDValueObject<object?>>>();
if (valueList is { Count: > 0 })
return VC.HandleObject(valueList[0], objectType);
var obj = JArray.Load(reader);
var list = obj.ToObject<List<ASCollectionPage?>>();
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;
public class ASOrderedCollectionPage : ASObject
public class ASOrderedCollectionPage : ASCollectionPage
{
public const string ObjectType = $"{Constants.ActivityStreamsNs}#OrderedCollectionPage";
public new const string ObjectType = $"{Constants.ActivityStreamsNs}#OrderedCollectionPage";
[JsonConstructor]
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;
[J($"{Constants.ActivityStreamsNs}#items")]
[JC(typeof(ASCollectionItemsConverter))]
public List<ASObject>? Items { get; set; }
[J($"{Constants.ActivityStreamsNs}#totalItems")]
[JC(typeof(VC))]
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; }
[JC(typeof(ASOrderedCollectionItemsConverter))]
public new List<ASObject>? Items
{
get => base.Items;
set => base.Items = value;
}
}
public sealed class ASOrderedCollectionPageConverter : JsonConverter