using Microsoft.EntityFrameworkCore; using ZB.MOM.WW.OtOpcUa.Configuration; using ZB.MOM.WW.OtOpcUa.Configuration.Entities; namespace ZB.MOM.WW.OtOpcUa.Admin.Services; /// /// Cluster CRUD surface used by the Blazor pages. Writes go through stored procs in later /// phases; Phase 1 reads via EF Core directly (DENY SELECT on dbo schema means this /// service connects as a DB owner during dev — production swaps in a read-only view grant). /// public sealed class ClusterService(OtOpcUaConfigDbContext db) { public Task> ListAsync(CancellationToken ct) => db.ServerClusters.AsNoTracking().OrderBy(c => c.ClusterId).ToListAsync(ct); public Task FindAsync(string clusterId, CancellationToken ct) => db.ServerClusters.AsNoTracking().FirstOrDefaultAsync(c => c.ClusterId == clusterId, ct); public async Task CreateAsync(ServerCluster cluster, string createdBy, CancellationToken ct) { cluster.CreatedAt = DateTime.UtcNow; cluster.CreatedBy = createdBy; db.ServerClusters.Add(cluster); await db.SaveChangesAsync(ct); return cluster; } }