namespace IronServices.Client; /// /// API client for IronLicensing operations. /// Access via IronServicesClient.Licensing /// public class LicensingApi { private readonly IronServicesClient _client; private readonly string _baseUrl; internal LicensingApi(IronServicesClient client, string baseUrl) { _client = client; _baseUrl = baseUrl; } private string Url(string endpoint) => IronServicesClient.BuildUrl(_baseUrl, endpoint); /// /// Get dashboard statistics. /// public async Task GetDashboardStatsAsync(CancellationToken ct = default) { return await _client.GetAsync(Url("api/v1/dashboard/stats"), ct) ?? new LicensingDashboardStats(); } /// /// Get recent activity from audit logs. /// public async Task> GetRecentActivityAsync(int limit = 50, CancellationToken ct = default) { return await _client.GetAsync>(Url($"api/v1/admin/audit?limit={limit}"), ct) ?? []; } /// /// Get licenses with optional filtering. /// public async Task> GetLicensesAsync(string? status = null, Guid? productId = null, int page = 1, int limit = 50, CancellationToken ct = default) { var query = new List { $"page={page}", $"limit={limit}" }; if (!string.IsNullOrEmpty(status)) query.Add($"status={status}"); if (productId.HasValue) query.Add($"productId={productId}"); var queryString = "?" + string.Join("&", query); return await _client.GetAsync>(Url($"api/v1/admin/licenses{queryString}"), ct) ?? []; } /// /// Get a specific license by ID. /// public async Task GetLicenseAsync(Guid id, CancellationToken ct = default) { return await _client.GetAsync(Url($"api/v1/admin/licenses/{id}"), ct); } /// /// Create a new license. /// public async Task CreateLicenseAsync(CreateLicenseRequest request, CancellationToken ct = default) { return await _client.PostAsync(Url("api/v1/admin/licenses"), request, ct); } /// /// Suspend a license. /// public async Task SuspendLicenseAsync(Guid id, string? reason = null, CancellationToken ct = default) { return await _client.PostAsync(Url($"api/v1/admin/licenses/{id}/suspend"), new { reason }, ct); } /// /// Revoke a license. /// public async Task RevokeLicenseAsync(Guid id, string? reason = null, CancellationToken ct = default) { return await _client.PostAsync(Url($"api/v1/admin/licenses/{id}/revoke"), new { reason }, ct); } /// /// Reactivate a suspended license. /// public async Task ReactivateLicenseAsync(Guid id, CancellationToken ct = default) { return await _client.PostAsync(Url($"api/v1/admin/licenses/{id}/reactivate"), new { }, ct); } /// /// Resend activation email for a license. /// public async Task ResendActivationEmailAsync(Guid id, CancellationToken ct = default) { await _client.PostAsync(Url($"api/v1/admin/licenses/{id}/resend-activation"), new { }, ct); } /// /// Update user profile. /// public async Task UpdateProfileAsync(UpdateProfileRequest request, CancellationToken ct = default) { await _client.PutAsync(Url("api/v1/profile"), request, ct); } /// /// Get tickets with optional status filter. /// public async Task> GetTicketsAsync(string? status = null, CancellationToken ct = default) { var query = !string.IsNullOrEmpty(status) ? $"?status={status}" : ""; return await _client.GetAsync>(Url($"api/v1/tickets{query}"), ct) ?? []; } /// /// Get a specific ticket with messages. /// public async Task GetTicketAsync(Guid id, CancellationToken ct = default) { return await _client.GetAsync(Url($"api/v1/tickets/{id}"), ct); } /// /// Create a new ticket. /// public async Task CreateTicketAsync(string subject, string message, string? category = null, CancellationToken ct = default) { return await _client.PostAsync(Url("api/v1/tickets"), new { subject, message, category }, ct); } /// /// Reply to a ticket. /// public async Task ReplyToTicketAsync(Guid ticketId, string content, CancellationToken ct = default) { return await _client.PostAsync(Url($"api/v1/tickets/{ticketId}/messages"), new { content }, ct); } /// /// Close a ticket. /// public async Task CloseTicketAsync(Guid id, CancellationToken ct = default) { return await _client.PostAsync(Url($"api/v1/tickets/{id}/close"), new { }, ct); } /// /// Reopen a closed ticket. /// public async Task ReopenTicketAsync(Guid id, CancellationToken ct = default) { return await _client.PostAsync(Url($"api/v1/tickets/{id}/reopen"), new { }, ct); } } public class CreateLicenseRequest { public Guid ProductId { get; set; } public string? Email { get; set; } public string? TierId { get; set; } public int? MaxActivations { get; set; } public DateTime? ExpiresAt { get; set; } }