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); }