Add ProjectStorageService and generated ProjectStorage models

This commit is contained in:
edmand46
2026-08-12 23:58:31 +03:00
parent 8cf738d9f0
commit 91c3d46ceb
6 changed files with 153 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
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);
}