fix(commons): resolve Commons-008 — replace ValueTuple in SetConnectionBindingsCommand with named ConnectionBinding record (CLI, ManagementService, TemplateEngine, CentralUI)

This commit is contained in:
Joseph Doherty
2026-05-16 23:54:31 -04:00
parent c583598888
commit b1f4251d75
8 changed files with 97 additions and 23 deletions

View File

@@ -73,7 +73,7 @@ public static class InstanceCommands
/// </summary>
internal static bool TryParseBindings(
string json,
out List<(string, int)>? bindings,
out List<ConnectionBinding>? bindings,
out string? error)
{
bindings = null;
@@ -88,7 +88,7 @@ public static class InstanceCommands
return false;
}
var result = new List<(string, int)>(pairs.Count);
var result = new List<ConnectionBinding>(pairs.Count);
foreach (var pair in pairs)
{
if (pair.Count != 2)
@@ -107,7 +107,7 @@ public static class InstanceCommands
error = "The second element of each binding (dataConnectionId) must be an integer.";
return false;
}
result.Add((pair[0].GetString()!, connectionId));
result.Add(new ConnectionBinding(pair[0].GetString()!, connectionId));
}
bindings = result;

View File

@@ -4,6 +4,7 @@
@using ScadaLink.Commons.Entities.Sites
@using ScadaLink.Commons.Entities.Templates
@using ScadaLink.Commons.Interfaces.Repositories
@using ScadaLink.Commons.Messages.Management
@using ScadaLink.Commons.Types.Enums
@using ScadaLink.TemplateEngine.Flattening
@using ScadaLink.TemplateEngine.Services
@@ -467,7 +468,7 @@
_saving = true;
try
{
var bindings = _bindingSelections.Select(kv => (kv.Key, kv.Value)).ToList();
var bindings = _bindingSelections.Select(kv => new ConnectionBinding(kv.Key, kv.Value)).ToList();
var user = await GetCurrentUserAsync();
var result = await InstanceService.SetConnectionBindingsAsync(Id, bindings, user);
if (result.IsSuccess)

View File

@@ -7,7 +7,15 @@ public record MgmtDeployInstanceCommand(int InstanceId);
public record MgmtEnableInstanceCommand(int InstanceId);
public record MgmtDisableInstanceCommand(int InstanceId);
public record MgmtDeleteInstanceCommand(int InstanceId);
public record SetConnectionBindingsCommand(int InstanceId, IReadOnlyList<(string AttributeName, int DataConnectionId)> Bindings);
/// <summary>
/// A single attribute-to-data-connection binding carried by
/// <see cref="SetConnectionBindingsCommand"/>. This is a named record (not a
/// <c>ValueTuple</c>) so it serializes with stable, named JSON properties and can
/// evolve additively per REQ-COM-5a.
/// </summary>
public record ConnectionBinding(string AttributeName, int DataConnectionId);
public record SetConnectionBindingsCommand(int InstanceId, IReadOnlyList<ConnectionBinding> Bindings);
public record SetInstanceOverridesCommand(int InstanceId, IReadOnlyDictionary<string, string?> Overrides);
public record SetInstanceAreaCommand(int InstanceId, int? AreaId);

View File

@@ -1,6 +1,7 @@
using ScadaLink.Commons.Entities.Instances;
using ScadaLink.Commons.Interfaces.Repositories;
using ScadaLink.Commons.Interfaces.Services;
using ScadaLink.Commons.Messages.Management;
using ScadaLink.Commons.Types;
using ScadaLink.Commons.Types.Enums;
using ScadaLink.TemplateEngine;
@@ -276,7 +277,7 @@ public class InstanceService
/// </summary>
public async Task<Result<IReadOnlyList<InstanceConnectionBinding>>> SetConnectionBindingsAsync(
int instanceId,
IReadOnlyList<(string AttributeName, int DataConnectionId)> bindings,
IReadOnlyList<ConnectionBinding> bindings,
string user,
CancellationToken cancellationToken = default)
{