@page "/admin/connections/create" @page "/admin/connections/{Id:int}/edit" @page "/admin/data-connections/create" @page "/admin/data-connections/{Id:int}/edit" @using ScadaLink.Security @using ScadaLink.Commons.Entities.Sites @using ScadaLink.Commons.Interfaces.Repositories @using ScadaLink.Commons.Types.DataConnections @using ScadaLink.Commons.Types.Flattening @using ScadaLink.Commons.Serialization @using ScadaLink.Commons.Validators @using ScadaLink.CentralUI.Components.Forms @attribute [Authorize(Policy = AuthorizationPolicies.RequireAdmin)] @inject ISiteRepository SiteRepository @inject NavigationManager NavigationManager

@(Id.HasValue ? "Edit Data Connection" : "Add Data Connection")

@if (_loading) { } else {
@if (_siteLocked) { } else { }
Backup Endpoint
@if (!_showBackup) {
} else {
Retries on active endpoint before switching to backup (default: 3)
} @if (_formError != null) {
@_formError
}
}
@code { [Parameter] public int? Id { get; set; } [SupplyParameterFromQuery] public int? SiteId { get; set; } private bool _loading = true; private DataConnection? _editingConnection; private List _sites = new(); private int _formSiteId; private string _siteName = string.Empty; private bool _siteLocked; private string _formName = string.Empty; private OpcUaEndpointConfig _primaryConfig = new(); private OpcUaEndpointConfig _backupConfig = new(); private bool _primaryIsLegacy; private bool _backupIsLegacy; private bool _showBackup; private int _formFailoverRetryCount = 3; private ValidationResult? _primaryErrors; private ValidationResult? _backupErrors; private string? _formError; protected override async Task OnInitializedAsync() { try { _sites = (await SiteRepository.GetAllSitesAsync()).ToList(); if (Id.HasValue) { _editingConnection = await SiteRepository.GetDataConnectionByIdAsync(Id.Value); if (_editingConnection != null) { _formSiteId = _editingConnection.SiteId; _siteName = _sites.FirstOrDefault(s => s.Id == _formSiteId)?.Name ?? $"Site {_formSiteId}"; _siteLocked = true; _formName = _editingConnection.Name; (_primaryConfig, _primaryIsLegacy) = OpcUaEndpointConfigSerializer.Deserialize(_editingConnection.PrimaryConfiguration); if (!string.IsNullOrWhiteSpace(_editingConnection.BackupConfiguration)) { (_backupConfig, _backupIsLegacy) = OpcUaEndpointConfigSerializer.Deserialize(_editingConnection.BackupConfiguration); _showBackup = true; _formFailoverRetryCount = _editingConnection.FailoverRetryCount; } } } else if (SiteId.HasValue) { var site = _sites.FirstOrDefault(s => s.Id == SiteId.Value); if (site != null) { _formSiteId = site.Id; _siteName = site.Name; _siteLocked = true; } } } catch (Exception ex) { _formError = $"Failed to load: {ex.Message}"; } finally { _loading = false; } } private async Task SaveConnection() { _formError = null; if (_formSiteId == 0) { _formError = "Site is required."; return; } if (string.IsNullOrWhiteSpace(_formName)) { _formError = "Name is required."; return; } _primaryErrors = OpcUaEndpointConfigValidator.Validate(_primaryConfig, "Primary."); _backupErrors = _showBackup ? OpcUaEndpointConfigValidator.Validate(_backupConfig, "Backup.") : null; if (!_primaryErrors.IsValid || (_backupErrors is { IsValid: false })) { _formError = "Fix the errors below before saving."; return; } var primaryJson = OpcUaEndpointConfigSerializer.Serialize(_primaryConfig); var backupJson = _showBackup ? OpcUaEndpointConfigSerializer.Serialize(_backupConfig) : null; try { if (_editingConnection != null) { _editingConnection.Name = _formName.Trim(); _editingConnection.Protocol = "OpcUa"; _editingConnection.PrimaryConfiguration = primaryJson; _editingConnection.BackupConfiguration = backupJson; _editingConnection.FailoverRetryCount = _showBackup ? _formFailoverRetryCount : 3; await SiteRepository.UpdateDataConnectionAsync(_editingConnection); } else { var conn = new DataConnection(_formName.Trim(), "OpcUa", _formSiteId) { PrimaryConfiguration = primaryJson, BackupConfiguration = backupJson, FailoverRetryCount = _showBackup ? _formFailoverRetryCount : 3 }; await SiteRepository.AddDataConnectionAsync(conn); } await SiteRepository.SaveChangesAsync(); NavigationManager.NavigateTo("/admin/connections"); } catch (Exception ex) { _formError = $"Save failed: {ex.Message}"; } } private void EnableBackup() => _showBackup = true; private void RemoveBackup() { _showBackup = false; _backupConfig = new OpcUaEndpointConfig(); _backupIsLegacy = false; _formFailoverRetryCount = 3; } private void GoBack() => NavigationManager.NavigateTo("/admin/connections"); }