65 lines
2.4 KiB
C#
65 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using RudderSdk.Core.Models.ProjectStorage;
|
|
|
|
namespace RudderSdk.Core;
|
|
|
|
/// <summary>Project key-value storage (global, shared across players).</summary>
|
|
public sealed class ProjectStorageService
|
|
{
|
|
private readonly RudderClient _client;
|
|
|
|
internal ProjectStorageService(RudderClient client) => _client = client;
|
|
|
|
/// <summary>Fetches one page of project storage items, optionally filtered by type.</summary>
|
|
public Task<GetProjectStorageResponse> GetAsync(string? type = null, int limit = 100, string? cursor = null, CancellationToken cancellationToken = default)
|
|
{
|
|
var query = Url.Query(
|
|
("types", type),
|
|
("limit", limit > 0 ? limit.ToString() : null),
|
|
("cursor", cursor));
|
|
|
|
return _client.SendAsync<GetProjectStorageResponse>("GET", "/sdk/v1/project-storage" + query, cancellationToken);
|
|
}
|
|
|
|
/// <summary>Iterates over all project storage items, following the cursor pagination.</summary>
|
|
public async IAsyncEnumerable<ProjectStorageItem> ListAllAsync(
|
|
string? type = null,
|
|
int limit = 100,
|
|
[EnumeratorCancellation] CancellationToken cancellationToken = default)
|
|
{
|
|
string? cursor = null;
|
|
do
|
|
{
|
|
var page = await GetAsync(type, limit, cursor, cancellationToken).ConfigureAwait(false);
|
|
if (page?.Items != null)
|
|
{
|
|
foreach (var item in page.Items)
|
|
yield return item;
|
|
}
|
|
|
|
cursor = page?.NextCursor;
|
|
}
|
|
while (!string.IsNullOrEmpty(cursor));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves (upserts) project storage items. When
|
|
/// <paramref name="idempotencyKey"/> is null, a random one is generated.
|
|
/// </summary>
|
|
public Task SaveAsync(IEnumerable<ProjectStorageUpdateItem> items, string? idempotencyKey = null, CancellationToken cancellationToken = default)
|
|
=> _client.SendAsync(
|
|
"PUT",
|
|
"/sdk/v1/project-storage",
|
|
new UpdateProjectStorageRequest
|
|
{
|
|
IdempotencyKey = idempotencyKey ?? Guid.NewGuid().ToString(),
|
|
Items = items?.ToList() ?? new List<ProjectStorageUpdateItem>()
|
|
},
|
|
cancellationToken);
|
|
}
|