refactor: simplify data connections from many-to-many site assignment to direct site ownership

Replace SiteDataConnectionAssignment join table with a direct SiteId FK on DataConnection,
simplifying the data model, repositories, UI, CLI, and deployment service.
This commit is contained in:
Joseph Doherty
2026-03-21 21:07:10 -04:00
parent cd6efeea90
commit 970d0a5cb3
25 changed files with 1543 additions and 490 deletions

View File

@@ -3,13 +3,15 @@ namespace ScadaLink.Commons.Entities.Sites;
public class DataConnection
{
public int Id { get; set; }
public int SiteId { get; set; }
public string Name { get; set; }
public string Protocol { get; set; }
public string? Configuration { get; set; }
public DataConnection(string name, string protocol)
public DataConnection(string name, string protocol, int siteId)
{
Name = name ?? throw new ArgumentNullException(nameof(name));
Protocol = protocol ?? throw new ArgumentNullException(nameof(protocol));
SiteId = siteId;
}
}

View File

@@ -1,8 +0,0 @@
namespace ScadaLink.Commons.Entities.Sites;
public class SiteDataConnectionAssignment
{
public int Id { get; set; }
public int SiteId { get; set; }
public int DataConnectionId { get; set; }
}

View File

@@ -10,7 +10,7 @@ public interface ICentralUiRepository
{
Task<IReadOnlyList<Site>> GetAllSitesAsync(CancellationToken cancellationToken = default);
Task<IReadOnlyList<DataConnection>> GetDataConnectionsBySiteIdAsync(int siteId, CancellationToken cancellationToken = default);
Task<IReadOnlyList<SiteDataConnectionAssignment>> GetAllSiteDataConnectionAssignmentsAsync(CancellationToken cancellationToken = default);
Task<IReadOnlyList<DataConnection>> GetAllDataConnectionsAsync(CancellationToken cancellationToken = default);
Task<IReadOnlyList<Template>> GetTemplateTreeAsync(CancellationToken cancellationToken = default);
Task<IReadOnlyList<Instance>> GetInstancesFilteredAsync(int? siteId = null, int? templateId = null, string? searchTerm = null, CancellationToken cancellationToken = default);
Task<IReadOnlyList<DeploymentRecord>> GetRecentDeploymentsAsync(int count, CancellationToken cancellationToken = default);

View File

@@ -24,11 +24,6 @@ public interface ISiteRepository
Task UpdateDataConnectionAsync(DataConnection connection, CancellationToken cancellationToken = default);
Task DeleteDataConnectionAsync(int id, CancellationToken cancellationToken = default);
// Site-Connection Assignments
Task<SiteDataConnectionAssignment?> GetSiteDataConnectionAssignmentAsync(int siteId, int dataConnectionId, CancellationToken cancellationToken = default);
Task AddSiteDataConnectionAssignmentAsync(SiteDataConnectionAssignment assignment, CancellationToken cancellationToken = default);
Task DeleteSiteDataConnectionAssignmentAsync(int id, CancellationToken cancellationToken = default);
// Instances (for deletion constraint checks)
Task<IReadOnlyList<Instance>> GetInstancesBySiteIdAsync(int siteId, CancellationToken cancellationToken = default);

View File

@@ -1,9 +1,7 @@
namespace ScadaLink.Commons.Messages.Management;
public record ListDataConnectionsCommand;
public record ListDataConnectionsCommand(int? SiteId = null);
public record GetDataConnectionCommand(int DataConnectionId);
public record CreateDataConnectionCommand(string Name, string Protocol, string? Configuration);
public record CreateDataConnectionCommand(int SiteId, string Name, string Protocol, string? Configuration);
public record UpdateDataConnectionCommand(int DataConnectionId, string Name, string Protocol, string? Configuration);
public record DeleteDataConnectionCommand(int DataConnectionId);
public record AssignDataConnectionToSiteCommand(int DataConnectionId, int SiteId);
public record UnassignDataConnectionFromSiteCommand(int AssignmentId);