using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using RudderSdk.Core.Models.Storage;
namespace RudderSdk.Core;
/// Player key-value storage.
public sealed class StorageService
{
private readonly RudderClient _client;
internal StorageService(RudderClient client) => _client = client;
/// Fetches one page of storage items, optionally filtered by type.
public Task 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("GET", "/sdk/v1/storage" + query, cancellationToken);
}
/// Iterates over all storage items, following the cursor pagination.
public async IAsyncEnumerable 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));
}
/// Saves (upserts) storage items.
public Task SaveAsync(IEnumerable items, CancellationToken cancellationToken = default)
=> _client.SendAsync(
"PUT",
"/sdk/v1/storage",
new UpdateStorageRequest { Items = items?.ToList() ?? new List() },
cancellationToken);
/// Deletes all items of the given type.
public Task DeleteAsync(string type, CancellationToken cancellationToken = default)
=> _client.SendAsync("DELETE", "/sdk/v1/storage" + Url.Query(("type", type)), cancellationToken);
}