Fix Galaxy paging review findings
This commit is contained in:
@@ -99,6 +99,14 @@ public sealed class GalaxyHierarchyCache : IGalaxyHierarchyCache
|
||||
LastQueriedAt = queriedAt,
|
||||
LastSuccessAt = queriedAt,
|
||||
LastError = null,
|
||||
DashboardSummary = previous.DashboardSummary with
|
||||
{
|
||||
Status = DashboardGalaxyStatus.Healthy,
|
||||
LastQueriedAt = queriedAt,
|
||||
LastSuccessAt = queriedAt,
|
||||
LastDeployTime = deployTime,
|
||||
LastError = null,
|
||||
},
|
||||
};
|
||||
Volatile.Write(ref _current, refreshed);
|
||||
_firstLoad.TrySetResult();
|
||||
|
||||
@@ -68,7 +68,8 @@ public sealed class GalaxyRepositoryGrpcService(
|
||||
ResolveUnavailableMessage(entry)));
|
||||
}
|
||||
|
||||
int offset = ParsePageToken(request.PageToken);
|
||||
PageToken pageToken = ParsePageToken(request.PageToken, entry.Sequence);
|
||||
int offset = pageToken.Offset;
|
||||
if (offset > entry.Objects.Count)
|
||||
{
|
||||
throw new RpcException(new Status(
|
||||
@@ -90,7 +91,7 @@ public sealed class GalaxyRepositoryGrpcService(
|
||||
int nextOffset = offset + take;
|
||||
if (nextOffset < entry.Objects.Count)
|
||||
{
|
||||
reply.NextPageToken = nextOffset.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||
reply.NextPageToken = FormatPageToken(entry.Sequence, nextOffset);
|
||||
}
|
||||
|
||||
return reply;
|
||||
@@ -182,15 +183,30 @@ public sealed class GalaxyRepositoryGrpcService(
|
||||
return Math.Min(pageSize, MaxDiscoverPageSize);
|
||||
}
|
||||
|
||||
private static int ParsePageToken(string pageToken)
|
||||
private static string FormatPageToken(long sequence, int offset)
|
||||
{
|
||||
return string.Concat(
|
||||
sequence.ToString(System.Globalization.CultureInfo.InvariantCulture),
|
||||
":",
|
||||
offset.ToString(System.Globalization.CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
private static PageToken ParsePageToken(string pageToken, long currentSequence)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(pageToken))
|
||||
{
|
||||
return 0;
|
||||
return new PageToken(currentSequence, Offset: 0);
|
||||
}
|
||||
|
||||
if (!int.TryParse(
|
||||
pageToken,
|
||||
string[] parts = pageToken.Split(':', count: 2);
|
||||
if (parts.Length != 2
|
||||
|| !long.TryParse(
|
||||
parts[0],
|
||||
System.Globalization.NumberStyles.None,
|
||||
System.Globalization.CultureInfo.InvariantCulture,
|
||||
out long sequence)
|
||||
|| !int.TryParse(
|
||||
parts[1],
|
||||
System.Globalization.NumberStyles.None,
|
||||
System.Globalization.CultureInfo.InvariantCulture,
|
||||
out int offset)
|
||||
@@ -201,9 +217,18 @@ public sealed class GalaxyRepositoryGrpcService(
|
||||
"DiscoverHierarchy page_token is invalid."));
|
||||
}
|
||||
|
||||
return offset;
|
||||
if (sequence != currentSequence)
|
||||
{
|
||||
throw new RpcException(new Status(
|
||||
StatusCode.InvalidArgument,
|
||||
"DiscoverHierarchy page_token is stale."));
|
||||
}
|
||||
|
||||
return new PageToken(sequence, offset);
|
||||
}
|
||||
|
||||
private sealed record PageToken(long Sequence, int Offset);
|
||||
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessage(
|
||||
"Style",
|
||||
"IDE0051:Remove unused private members",
|
||||
|
||||
Reference in New Issue
Block a user