@page "/admin/api-keys" @using ScadaLink.Security @using ScadaLink.Commons.Entities.InboundApi @using ScadaLink.Commons.Interfaces.Repositories @attribute [Authorize(Policy = AuthorizationPolicies.RequireAdmin)] @inject IInboundApiRepository InboundApiRepository @inject NavigationManager NavigationManager

API Key Management

@if (_loading) { } else if (_errorMessage != null) {
@_errorMessage
} else { @if (_keys.Count == 0) { } @foreach (var key in _keys) { }
ID Name Key Value Status Actions
No API keys configured.
@key.Id @key.Name @MaskKeyValue(key.KeyValue) @if (key.IsEnabled) { Enabled } else { Disabled } @if (key.IsEnabled) { } else { }
}
@code { private List _keys = new(); private bool _loading = true; private string? _errorMessage; private ToastNotification _toast = default!; private ConfirmDialog _confirmDialog = default!; protected override async Task OnInitializedAsync() { await LoadDataAsync(); } private async Task LoadDataAsync() { _loading = true; _errorMessage = null; try { _keys = (await InboundApiRepository.GetAllApiKeysAsync()).ToList(); } catch (Exception ex) { _errorMessage = $"Failed to load API keys: {ex.Message}"; } _loading = false; } private static string MaskKeyValue(string keyValue) { if (keyValue.Length <= 8) return new string('*', keyValue.Length); return keyValue[..4] + new string('*', keyValue.Length - 8) + keyValue[^4..]; } private async Task ToggleKey(ApiKey key) { try { key.IsEnabled = !key.IsEnabled; await InboundApiRepository.UpdateApiKeyAsync(key); await InboundApiRepository.SaveChangesAsync(); _toast.ShowSuccess($"API key '{key.Name}' {(key.IsEnabled ? "enabled" : "disabled")}."); } catch (Exception ex) { _toast.ShowError($"Toggle failed: {ex.Message}"); } } private async Task DeleteKey(ApiKey key) { var confirmed = await _confirmDialog.ShowAsync( $"Delete API key '{key.Name}'? This cannot be undone.", "Delete API Key"); if (!confirmed) return; try { await InboundApiRepository.DeleteApiKeyAsync(key.Id); await InboundApiRepository.SaveChangesAsync(); _toast.ShowSuccess($"API key '{key.Name}' deleted."); await LoadDataAsync(); } catch (Exception ex) { _toast.ShowError($"Delete failed: {ex.Message}"); } } }