[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:
parent
8c1a635027
commit
481bd423b3
3 changed files with 19 additions and 34 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue