[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; }
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue