namespace IronServices.Client;
///
/// API client for IronTelemetry operations.
/// Access via IronServicesClient.Telemetry
///
public class TelemetryApi
{
private readonly IronServicesClient _client;
private readonly string _baseUrl;
internal TelemetryApi(IronServicesClient client, string baseUrl)
{
_client = client;
_baseUrl = baseUrl;
}
private string Url(string endpoint) => IronServicesClient.BuildUrl(_baseUrl, endpoint);
#region Dashboard & Stats
///
/// Get issue statistics (serves as dashboard stats).
///
public async Task GetDashboardStatsAsync(Guid? projectId = null, CancellationToken ct = default)
{
var query = projectId.HasValue ? $"?projectId={projectId}" : "";
return await _client.GetAsync(Url($"api/v1/issues/stats{query}"), ct)
?? new TelemetryDashboardStats();
}
#endregion
#region Issues
///
/// Get issues with optional filtering.
///
public async Task> GetIssuesAsync(Guid? projectId = null, string? status = null, int page = 1, int pageSize = 20, CancellationToken ct = default)
{
var query = new List { $"page={page}", $"pageSize={pageSize}" };
if (projectId.HasValue) query.Add($"projectId={projectId}");
if (!string.IsNullOrEmpty(status)) query.Add($"status={status}");
var queryString = "?" + string.Join("&", query);
var result = await _client.GetAsync(Url($"api/v1/issues{queryString}"), ct);
return result?.Items ?? [];
}
///
/// Get a specific issue by ID.
///
public async Task GetIssueAsync(Guid issueId, CancellationToken ct = default)
{
return await _client.GetAsync(Url($"api/v1/issues/{issueId}"), ct);
}
///
/// Acknowledge an issue.
///
public async Task AcknowledgeIssueAsync(Guid issueId, CancellationToken ct = default)
{
return await _client.PostAsync