diff --git a/.template-cache/2dc03e2b2b45fef3 b/.template-cache/2dc03e2b2b45fef3
index 07ab87b..292fbb4 160000
--- a/.template-cache/2dc03e2b2b45fef3
+++ b/.template-cache/2dc03e2b2b45fef3
@@ -1 +1 @@
-Subproject commit 07ab87bc65fa52879cadb8a18de60a7c51ac6d78
+Subproject commit 292fbb4bfe873e760b8dd27a70acc072cbe98dc9
diff --git a/OTSSignsOrchestrator.Core/Configuration/AppConstants.cs b/OTSSignsOrchestrator.Core/Configuration/AppConstants.cs
index 4af390d..497a94e 100644
--- a/OTSSignsOrchestrator.Core/Configuration/AppConstants.cs
+++ b/OTSSignsOrchestrator.Core/Configuration/AppConstants.cs
@@ -8,12 +8,34 @@ public static class AppConstants
public const string AdminRole = "Admin";
public const string ViewerRole = "Viewer";
+ // ── Global Docker secret names ──────────────────────────────────────────
+
/// Docker secret name for the global SMTP password.
public const string GlobalSmtpSecretName = "global_smtp_password";
- /// Build a per-customer MySQL password secret name.
- public static string CustomerMysqlSecretName(string customerName)
- => $"{SanitizeName(customerName)}_mysql_password";
+ /// Docker secret name for the shared MySQL host address.
+ public const string GlobalMysqlHostSecretName = "global_mysql_host";
+
+ /// Docker secret name for the shared MySQL port.
+ public const string GlobalMysqlPortSecretName = "global_mysql_port";
+
+ // ── Per-instance Docker secret name builders ────────────────────────────
+
+ /// Build a per-instance MySQL password secret name from the 3-letter abbreviation.
+ public static string CustomerMysqlPasswordSecretName(string abbrev)
+ => $"{abbrev}-cms-db-password";
+
+ /// Build a per-instance MySQL username secret name from the 3-letter abbreviation.
+ public static string CustomerMysqlUserSecretName(string abbrev)
+ => $"{abbrev}-cms-db-user";
+
+ /// Returns all per-instance MySQL secret names for a given abbreviation.
+ public static string[] AllCustomerMysqlSecretNames(string abbrev)
+ => new[]
+ {
+ CustomerMysqlPasswordSecretName(abbrev),
+ CustomerMysqlUserSecretName(abbrev),
+ };
/// Sanitize a customer name for use in Docker/secret names.
public static string SanitizeName(string name)
diff --git a/OTSSignsOrchestrator.Core/Configuration/AppOptions.cs b/OTSSignsOrchestrator.Core/Configuration/AppOptions.cs
index 7935356..e3cb2d4 100644
--- a/OTSSignsOrchestrator.Core/Configuration/AppOptions.cs
+++ b/OTSSignsOrchestrator.Core/Configuration/AppOptions.cs
@@ -72,5 +72,5 @@ public class InstanceDefaultsOptions
public string LibraryShareSubPath { get; set; } = "{abbrev}-cms-library";
public string MySqlDatabaseTemplate { get; set; } = "{abbrev}_cms_db";
- public string MySqlUserTemplate { get; set; } = "{abbrev}_cms";
+ public string MySqlUserTemplate { get; set; } = "{abbrev}_cms_user";
}
diff --git a/OTSSignsOrchestrator.Core/Data/XiboContext.cs b/OTSSignsOrchestrator.Core/Data/XiboContext.cs
index 2137297..f11d3f1 100644
--- a/OTSSignsOrchestrator.Core/Data/XiboContext.cs
+++ b/OTSSignsOrchestrator.Core/Data/XiboContext.cs
@@ -15,9 +15,7 @@ public class XiboContext : DbContext
_dataProtection = dataProtection;
}
- public DbSet CmsInstances => Set();
public DbSet SshHosts => Set();
- public DbSet SecretMetadata => Set();
public DbSet OperationLogs => Set();
public DbSet AppSettings => Set();
@@ -25,32 +23,6 @@ public class XiboContext : DbContext
{
base.OnModelCreating(modelBuilder);
- // --- CmsInstance ---
- modelBuilder.Entity(entity =>
- {
- entity.HasIndex(e => e.StackName).IsUnique();
- entity.HasIndex(e => e.CustomerName);
- entity.HasQueryFilter(e => e.DeletedAt == null);
-
- entity.HasOne(e => e.SshHost)
- .WithMany(h => h.Instances)
- .HasForeignKey(e => e.SshHostId)
- .OnDelete(DeleteBehavior.SetNull);
-
- if (_dataProtection != null)
- {
- var protector = _dataProtection.CreateProtector("OTSSignsOrchestrator.CmsInstance");
- var pwdConverter = new ValueConverter(
- v => v != null ? protector.Protect(v) : null,
- v => v != null ? protector.Unprotect(v) : null);
-
- entity.Property(e => e.XiboPassword).HasConversion(pwdConverter);
- entity.Property(e => e.XiboUsername).HasConversion(pwdConverter);
- entity.Property(e => e.TemplateRepoPat).HasConversion(pwdConverter);
- entity.Property(e => e.CifsPassword).HasConversion(pwdConverter);
- }
- });
-
// --- SshHost ---
modelBuilder.Entity(entity =>
{
@@ -71,17 +43,11 @@ public class XiboContext : DbContext
}
});
- // --- SecretMetadata ---
- modelBuilder.Entity(entity =>
- {
- entity.HasIndex(e => e.Name).IsUnique();
- });
-
// --- OperationLog ---
modelBuilder.Entity(entity =>
{
entity.HasIndex(e => e.Timestamp);
- entity.HasIndex(e => e.InstanceId);
+ entity.HasIndex(e => e.StackName);
entity.HasIndex(e => e.Operation);
});
diff --git a/OTSSignsOrchestrator.Core/Migrations/20260219005507_ReplaceCifsWithNfs.Designer.cs b/OTSSignsOrchestrator.Core/Migrations/20260219005507_ReplaceCifsWithNfs.Designer.cs
new file mode 100644
index 0000000..4cca5a8
--- /dev/null
+++ b/OTSSignsOrchestrator.Core/Migrations/20260219005507_ReplaceCifsWithNfs.Designer.cs
@@ -0,0 +1,339 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using OTSSignsOrchestrator.Core.Data;
+
+#nullable disable
+
+namespace OTSSignsOrchestrator.Core.Migrations
+{
+ [DbContext(typeof(XiboContext))]
+ [Migration("20260219005507_ReplaceCifsWithNfs")]
+ partial class ReplaceCifsWithNfs
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "9.0.2");
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.AppSetting", b =>
+ {
+ b.Property("Key")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("TEXT");
+
+ b.Property("IsSensitive")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Value")
+ .HasMaxLength(4000)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Key");
+
+ b.HasIndex("Category");
+
+ b.ToTable("AppSettings");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CmsServerName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Constraints")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomerAbbrev")
+ .IsRequired()
+ .HasMaxLength(3)
+ .HasColumnType("TEXT");
+
+ b.Property("CustomerName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("DeletedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("HostHttpPort")
+ .HasColumnType("INTEGER");
+
+ b.Property("LibraryHostPath")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsExport")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsExportFolder")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsExtraOptions")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsServer")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SmtpServer")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SmtpUsername")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SshHostId")
+ .HasColumnType("TEXT");
+
+ b.Property("StackName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("Status")
+ .HasColumnType("INTEGER");
+
+ b.Property("TemplateCacheKey")
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateLastFetch")
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateRepoPat")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateRepoUrl")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("ThemeHostPath")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("XiboApiTestStatus")
+ .HasColumnType("INTEGER");
+
+ b.Property("XiboApiTestedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("XiboPassword")
+ .HasMaxLength(1000)
+ .HasColumnType("TEXT");
+
+ b.Property("XiboUsername")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CustomerName");
+
+ b.HasIndex("SshHostId");
+
+ b.HasIndex("StackName")
+ .IsUnique();
+
+ b.ToTable("CmsInstances");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.OperationLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("DurationMs")
+ .HasColumnType("INTEGER");
+
+ b.Property("InstanceId")
+ .HasColumnType("TEXT");
+
+ b.Property("Message")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Operation")
+ .HasColumnType("INTEGER");
+
+ b.Property("Status")
+ .HasColumnType("INTEGER");
+
+ b.Property("Timestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("Operation");
+
+ b.HasIndex("Timestamp");
+
+ b.ToTable("OperationLogs");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SecretMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomerName")
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("IsGlobal")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastRotatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("SecretMetadata");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SshHost", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Host")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("KeyPassphrase")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Label")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("LastTestSuccess")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastTestedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Password")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Port")
+ .HasColumnType("INTEGER");
+
+ b.Property("PrivateKeyPath")
+ .HasMaxLength(1000)
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UseKeyAuth")
+ .HasColumnType("INTEGER");
+
+ b.Property("Username")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Label")
+ .IsUnique();
+
+ b.ToTable("SshHosts");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
+ {
+ b.HasOne("OTSSignsOrchestrator.Core.Models.Entities.SshHost", "SshHost")
+ .WithMany("Instances")
+ .HasForeignKey("SshHostId")
+ .OnDelete(DeleteBehavior.SetNull);
+
+ b.Navigation("SshHost");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.OperationLog", b =>
+ {
+ b.HasOne("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", "Instance")
+ .WithMany("OperationLogs")
+ .HasForeignKey("InstanceId");
+
+ b.Navigation("Instance");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
+ {
+ b.Navigation("OperationLogs");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SshHost", b =>
+ {
+ b.Navigation("Instances");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/OTSSignsOrchestrator.Core/Migrations/20260219005507_ReplaceCifsWithNfs.cs b/OTSSignsOrchestrator.Core/Migrations/20260219005507_ReplaceCifsWithNfs.cs
new file mode 100644
index 0000000..5528f95
--- /dev/null
+++ b/OTSSignsOrchestrator.Core/Migrations/20260219005507_ReplaceCifsWithNfs.cs
@@ -0,0 +1,98 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace OTSSignsOrchestrator.Core.Migrations
+{
+ ///
+ public partial class ReplaceCifsWithNfs : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ // 1. Add new NFS columns
+ migrationBuilder.AddColumn(
+ name: "NfsServer",
+ table: "CmsInstances",
+ type: "TEXT",
+ maxLength: 200,
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "NfsExport",
+ table: "CmsInstances",
+ type: "TEXT",
+ maxLength: 500,
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "NfsExportFolder",
+ table: "CmsInstances",
+ type: "TEXT",
+ maxLength: 500,
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "NfsExtraOptions",
+ table: "CmsInstances",
+ type: "TEXT",
+ maxLength: 500,
+ nullable: true);
+
+ // 2. Migrate existing CIFS data into NFS columns
+ // NfsServer = CifsServer, NfsExport = '/' + CifsShareName, NfsExportFolder = CifsShareFolder
+ migrationBuilder.Sql(
+ """
+ UPDATE CmsInstances
+ SET NfsServer = CifsServer,
+ NfsExport = CASE WHEN CifsShareName IS NOT NULL THEN '/' || CifsShareName ELSE NULL END,
+ NfsExportFolder = CifsShareFolder,
+ NfsExtraOptions = CifsExtraOptions
+ WHERE CifsServer IS NOT NULL;
+ """);
+
+ // 3. Drop old CIFS columns
+ migrationBuilder.DropColumn(name: "CifsServer", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "CifsShareName", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "CifsShareFolder", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "CifsUsername", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "CifsPassword", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "CifsExtraOptions", table: "CmsInstances");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ // Re-add CIFS columns
+ migrationBuilder.AddColumn(
+ name: "CifsServer", table: "CmsInstances", type: "TEXT", maxLength: 200, nullable: true);
+ migrationBuilder.AddColumn(
+ name: "CifsShareName", table: "CmsInstances", type: "TEXT", maxLength: 500, nullable: true);
+ migrationBuilder.AddColumn(
+ name: "CifsShareFolder", table: "CmsInstances", type: "TEXT", maxLength: 500, nullable: true);
+ migrationBuilder.AddColumn(
+ name: "CifsUsername", table: "CmsInstances", type: "TEXT", maxLength: 200, nullable: true);
+ migrationBuilder.AddColumn(
+ name: "CifsPassword", table: "CmsInstances", type: "TEXT", maxLength: 1000, nullable: true);
+ migrationBuilder.AddColumn(
+ name: "CifsExtraOptions", table: "CmsInstances", type: "TEXT", maxLength: 500, nullable: true);
+
+ // Copy NFS data back to CIFS columns
+ migrationBuilder.Sql(
+ """
+ UPDATE CmsInstances
+ SET CifsServer = NfsServer,
+ CifsShareName = CASE WHEN NfsExport IS NOT NULL THEN LTRIM(NfsExport, '/') ELSE NULL END,
+ CifsShareFolder = NfsExportFolder,
+ CifsExtraOptions = NfsExtraOptions
+ WHERE NfsServer IS NOT NULL;
+ """);
+
+ // Drop NFS columns
+ migrationBuilder.DropColumn(name: "NfsServer", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "NfsExport", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "NfsExportFolder", table: "CmsInstances");
+ migrationBuilder.DropColumn(name: "NfsExtraOptions", table: "CmsInstances");
+ }
+ }
+}
diff --git a/OTSSignsOrchestrator.Core/Migrations/20260219020727_AddNewtCredentials.Designer.cs b/OTSSignsOrchestrator.Core/Migrations/20260219020727_AddNewtCredentials.Designer.cs
new file mode 100644
index 0000000..b9a66ff
--- /dev/null
+++ b/OTSSignsOrchestrator.Core/Migrations/20260219020727_AddNewtCredentials.Designer.cs
@@ -0,0 +1,347 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using OTSSignsOrchestrator.Core.Data;
+
+#nullable disable
+
+namespace OTSSignsOrchestrator.Core.Migrations
+{
+ [DbContext(typeof(XiboContext))]
+ [Migration("20260219020727_AddNewtCredentials")]
+ partial class AddNewtCredentials
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "9.0.2");
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.AppSetting", b =>
+ {
+ b.Property("Key")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("TEXT");
+
+ b.Property("IsSensitive")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Value")
+ .HasMaxLength(4000)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Key");
+
+ b.HasIndex("Category");
+
+ b.ToTable("AppSettings");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CmsServerName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Constraints")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomerAbbrev")
+ .IsRequired()
+ .HasMaxLength(3)
+ .HasColumnType("TEXT");
+
+ b.Property("CustomerName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("DeletedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("HostHttpPort")
+ .HasColumnType("INTEGER");
+
+ b.Property("LibraryHostPath")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NewtId")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NewtSecret")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsExport")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsExportFolder")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsExtraOptions")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("NfsServer")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SmtpServer")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SmtpUsername")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SshHostId")
+ .HasColumnType("TEXT");
+
+ b.Property("StackName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("Status")
+ .HasColumnType("INTEGER");
+
+ b.Property("TemplateCacheKey")
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateLastFetch")
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateRepoPat")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateRepoUrl")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("ThemeHostPath")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("XiboApiTestStatus")
+ .HasColumnType("INTEGER");
+
+ b.Property("XiboApiTestedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("XiboPassword")
+ .HasMaxLength(1000)
+ .HasColumnType("TEXT");
+
+ b.Property("XiboUsername")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CustomerName");
+
+ b.HasIndex("SshHostId");
+
+ b.HasIndex("StackName")
+ .IsUnique();
+
+ b.ToTable("CmsInstances");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.OperationLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("DurationMs")
+ .HasColumnType("INTEGER");
+
+ b.Property("InstanceId")
+ .HasColumnType("TEXT");
+
+ b.Property("Message")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Operation")
+ .HasColumnType("INTEGER");
+
+ b.Property("Status")
+ .HasColumnType("INTEGER");
+
+ b.Property("Timestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("Operation");
+
+ b.HasIndex("Timestamp");
+
+ b.ToTable("OperationLogs");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SecretMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomerName")
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.Property("IsGlobal")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastRotatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("SecretMetadata");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SshHost", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Host")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("KeyPassphrase")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Label")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("LastTestSuccess")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastTestedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Password")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Port")
+ .HasColumnType("INTEGER");
+
+ b.Property("PrivateKeyPath")
+ .HasMaxLength(1000)
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UseKeyAuth")
+ .HasColumnType("INTEGER");
+
+ b.Property("Username")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Label")
+ .IsUnique();
+
+ b.ToTable("SshHosts");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
+ {
+ b.HasOne("OTSSignsOrchestrator.Core.Models.Entities.SshHost", "SshHost")
+ .WithMany("Instances")
+ .HasForeignKey("SshHostId")
+ .OnDelete(DeleteBehavior.SetNull);
+
+ b.Navigation("SshHost");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.OperationLog", b =>
+ {
+ b.HasOne("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", "Instance")
+ .WithMany("OperationLogs")
+ .HasForeignKey("InstanceId");
+
+ b.Navigation("Instance");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
+ {
+ b.Navigation("OperationLogs");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SshHost", b =>
+ {
+ b.Navigation("Instances");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/OTSSignsOrchestrator.Core/Migrations/20260219020727_AddNewtCredentials.cs b/OTSSignsOrchestrator.Core/Migrations/20260219020727_AddNewtCredentials.cs
new file mode 100644
index 0000000..ad0d105
--- /dev/null
+++ b/OTSSignsOrchestrator.Core/Migrations/20260219020727_AddNewtCredentials.cs
@@ -0,0 +1,40 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace OTSSignsOrchestrator.Core.Migrations
+{
+ ///
+ public partial class AddNewtCredentials : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "NewtId",
+ table: "CmsInstances",
+ type: "TEXT",
+ maxLength: 500,
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "NewtSecret",
+ table: "CmsInstances",
+ type: "TEXT",
+ maxLength: 500,
+ nullable: true);
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "NewtId",
+ table: "CmsInstances");
+
+ migrationBuilder.DropColumn(
+ name: "NewtSecret",
+ table: "CmsInstances");
+ }
+ }
+}
diff --git a/OTSSignsOrchestrator.Core/Migrations/20260219121529_RemoveCmsInstancesAndSecretMetadata.Designer.cs b/OTSSignsOrchestrator.Core/Migrations/20260219121529_RemoveCmsInstancesAndSecretMetadata.Designer.cs
new file mode 100644
index 0000000..ea5f1fc
--- /dev/null
+++ b/OTSSignsOrchestrator.Core/Migrations/20260219121529_RemoveCmsInstancesAndSecretMetadata.Designer.cs
@@ -0,0 +1,153 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using OTSSignsOrchestrator.Core.Data;
+
+#nullable disable
+
+namespace OTSSignsOrchestrator.Core.Migrations
+{
+ [DbContext(typeof(XiboContext))]
+ [Migration("20260219121529_RemoveCmsInstancesAndSecretMetadata")]
+ partial class RemoveCmsInstancesAndSecretMetadata
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "9.0.2");
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.AppSetting", b =>
+ {
+ b.Property("Key")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("TEXT");
+
+ b.Property("IsSensitive")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Value")
+ .HasMaxLength(4000)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Key");
+
+ b.HasIndex("Category");
+
+ b.ToTable("AppSettings");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.OperationLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("DurationMs")
+ .HasColumnType("INTEGER");
+
+ b.Property("Message")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Operation")
+ .HasColumnType("INTEGER");
+
+ b.Property("StackName")
+ .HasMaxLength(150)
+ .HasColumnType("TEXT");
+
+ b.Property("Status")
+ .HasColumnType("INTEGER");
+
+ b.Property("Timestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Operation");
+
+ b.HasIndex("StackName");
+
+ b.HasIndex("Timestamp");
+
+ b.ToTable("OperationLogs");
+ });
+
+ modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SshHost", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Host")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("KeyPassphrase")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Label")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("LastTestSuccess")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastTestedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Password")
+ .HasMaxLength(2000)
+ .HasColumnType("TEXT");
+
+ b.Property("Port")
+ .HasColumnType("INTEGER");
+
+ b.Property("PrivateKeyPath")
+ .HasMaxLength(1000)
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UseKeyAuth")
+ .HasColumnType("INTEGER");
+
+ b.Property("Username")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Label")
+ .IsUnique();
+
+ b.ToTable("SshHosts");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/OTSSignsOrchestrator.Core/Migrations/20260219121529_RemoveCmsInstancesAndSecretMetadata.cs b/OTSSignsOrchestrator.Core/Migrations/20260219121529_RemoveCmsInstancesAndSecretMetadata.cs
new file mode 100644
index 0000000..46b147e
--- /dev/null
+++ b/OTSSignsOrchestrator.Core/Migrations/20260219121529_RemoveCmsInstancesAndSecretMetadata.cs
@@ -0,0 +1,159 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace OTSSignsOrchestrator.Core.Migrations
+{
+ ///
+ public partial class RemoveCmsInstancesAndSecretMetadata : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_OperationLogs_CmsInstances_InstanceId",
+ table: "OperationLogs");
+
+ migrationBuilder.DropTable(
+ name: "CmsInstances");
+
+ migrationBuilder.DropTable(
+ name: "SecretMetadata");
+
+ migrationBuilder.DropIndex(
+ name: "IX_OperationLogs_InstanceId",
+ table: "OperationLogs");
+
+ migrationBuilder.DropColumn(
+ name: "InstanceId",
+ table: "OperationLogs");
+
+ migrationBuilder.AddColumn(
+ name: "StackName",
+ table: "OperationLogs",
+ type: "TEXT",
+ maxLength: 150,
+ nullable: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_OperationLogs_StackName",
+ table: "OperationLogs",
+ column: "StackName");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropIndex(
+ name: "IX_OperationLogs_StackName",
+ table: "OperationLogs");
+
+ migrationBuilder.DropColumn(
+ name: "StackName",
+ table: "OperationLogs");
+
+ migrationBuilder.AddColumn(
+ name: "InstanceId",
+ table: "OperationLogs",
+ type: "TEXT",
+ nullable: true);
+
+ migrationBuilder.CreateTable(
+ name: "CmsInstances",
+ columns: table => new
+ {
+ Id = table.Column(type: "TEXT", nullable: false),
+ SshHostId = table.Column(type: "TEXT", nullable: true),
+ CmsServerName = table.Column(type: "TEXT", maxLength: 200, nullable: false),
+ Constraints = table.Column(type: "TEXT", maxLength: 2000, nullable: true),
+ CreatedAt = table.Column(type: "TEXT", nullable: false),
+ CustomerAbbrev = table.Column(type: "TEXT", maxLength: 3, nullable: false),
+ CustomerName = table.Column(type: "TEXT", maxLength: 100, nullable: false),
+ DeletedAt = table.Column(type: "TEXT", nullable: true),
+ HostHttpPort = table.Column(type: "INTEGER", nullable: false),
+ LibraryHostPath = table.Column(type: "TEXT", maxLength: 500, nullable: false),
+ NewtId = table.Column(type: "TEXT", maxLength: 500, nullable: true),
+ NewtSecret = table.Column(type: "TEXT", maxLength: 500, nullable: true),
+ NfsExport = table.Column(type: "TEXT", maxLength: 500, nullable: true),
+ NfsExportFolder = table.Column(type: "TEXT", maxLength: 500, nullable: true),
+ NfsExtraOptions = table.Column(type: "TEXT", maxLength: 500, nullable: true),
+ NfsServer = table.Column(type: "TEXT", maxLength: 200, nullable: true),
+ SmtpServer = table.Column(type: "TEXT", maxLength: 200, nullable: false),
+ SmtpUsername = table.Column(type: "TEXT", maxLength: 200, nullable: false),
+ StackName = table.Column(type: "TEXT", maxLength: 100, nullable: false),
+ Status = table.Column(type: "INTEGER", nullable: false),
+ TemplateCacheKey = table.Column(type: "TEXT", maxLength: 100, nullable: true),
+ TemplateLastFetch = table.Column(type: "TEXT", nullable: true),
+ TemplateRepoPat = table.Column(type: "TEXT", maxLength: 500, nullable: true),
+ TemplateRepoUrl = table.Column(type: "TEXT", maxLength: 500, nullable: false),
+ ThemeHostPath = table.Column(type: "TEXT", maxLength: 500, nullable: false),
+ UpdatedAt = table.Column(type: "TEXT", nullable: false),
+ XiboApiTestStatus = table.Column(type: "INTEGER", nullable: false),
+ XiboApiTestedAt = table.Column(type: "TEXT", nullable: true),
+ XiboPassword = table.Column(type: "TEXT", maxLength: 1000, nullable: true),
+ XiboUsername = table.Column(type: "TEXT", maxLength: 500, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_CmsInstances", x => x.Id);
+ table.ForeignKey(
+ name: "FK_CmsInstances_SshHosts_SshHostId",
+ column: x => x.SshHostId,
+ principalTable: "SshHosts",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.SetNull);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "SecretMetadata",
+ columns: table => new
+ {
+ Id = table.Column(type: "TEXT", nullable: false),
+ CreatedAt = table.Column(type: "TEXT", nullable: false),
+ CustomerName = table.Column(type: "TEXT", maxLength: 100, nullable: true),
+ IsGlobal = table.Column(type: "INTEGER", nullable: false),
+ LastRotatedAt = table.Column(type: "TEXT", nullable: true),
+ Name = table.Column(type: "TEXT", maxLength: 200, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_SecretMetadata", x => x.Id);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_OperationLogs_InstanceId",
+ table: "OperationLogs",
+ column: "InstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_CmsInstances_CustomerName",
+ table: "CmsInstances",
+ column: "CustomerName");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_CmsInstances_SshHostId",
+ table: "CmsInstances",
+ column: "SshHostId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_CmsInstances_StackName",
+ table: "CmsInstances",
+ column: "StackName",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_SecretMetadata_Name",
+ table: "SecretMetadata",
+ column: "Name",
+ unique: true);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_OperationLogs_CmsInstances_InstanceId",
+ table: "OperationLogs",
+ column: "InstanceId",
+ principalTable: "CmsInstances",
+ principalColumn: "Id");
+ }
+ }
+}
diff --git a/OTSSignsOrchestrator.Core/Migrations/XiboContextModelSnapshot.cs b/OTSSignsOrchestrator.Core/Migrations/XiboContextModelSnapshot.cs
index 3230a26..437aa0e 100644
--- a/OTSSignsOrchestrator.Core/Migrations/XiboContextModelSnapshot.cs
+++ b/OTSSignsOrchestrator.Core/Migrations/XiboContextModelSnapshot.cs
@@ -45,140 +45,6 @@ namespace OTSSignsOrchestrator.Core.Migrations
b.ToTable("AppSettings");
});
- modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.CmsInstance", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT");
-
- b.Property("CifsExtraOptions")
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("CifsPassword")
- .HasMaxLength(1000)
- .HasColumnType("TEXT");
-
- b.Property("CifsServer")
- .HasMaxLength(200)
- .HasColumnType("TEXT");
-
- b.Property("CifsShareFolder")
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("CifsShareName")
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("CifsUsername")
- .HasMaxLength(200)
- .HasColumnType("TEXT");
-
- b.Property("CmsServerName")
- .IsRequired()
- .HasMaxLength(200)
- .HasColumnType("TEXT");
-
- b.Property("Constraints")
- .HasMaxLength(2000)
- .HasColumnType("TEXT");
-
- b.Property("CreatedAt")
- .HasColumnType("TEXT");
-
- b.Property("CustomerAbbrev")
- .IsRequired()
- .HasMaxLength(3)
- .HasColumnType("TEXT");
-
- b.Property("CustomerName")
- .IsRequired()
- .HasMaxLength(100)
- .HasColumnType("TEXT");
-
- b.Property("DeletedAt")
- .HasColumnType("TEXT");
-
- b.Property("HostHttpPort")
- .HasColumnType("INTEGER");
-
- b.Property("LibraryHostPath")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("SmtpServer")
- .IsRequired()
- .HasMaxLength(200)
- .HasColumnType("TEXT");
-
- b.Property("SmtpUsername")
- .IsRequired()
- .HasMaxLength(200)
- .HasColumnType("TEXT");
-
- b.Property("SshHostId")
- .HasColumnType("TEXT");
-
- b.Property("StackName")
- .IsRequired()
- .HasMaxLength(100)
- .HasColumnType("TEXT");
-
- b.Property("Status")
- .HasColumnType("INTEGER");
-
- b.Property("TemplateCacheKey")
- .HasMaxLength(100)
- .HasColumnType("TEXT");
-
- b.Property("TemplateLastFetch")
- .HasColumnType("TEXT");
-
- b.Property("TemplateRepoPat")
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("TemplateRepoUrl")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("ThemeHostPath")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.Property("UpdatedAt")
- .HasColumnType("TEXT");
-
- b.Property("XiboApiTestStatus")
- .HasColumnType("INTEGER");
-
- b.Property("XiboApiTestedAt")
- .HasColumnType("TEXT");
-
- b.Property("XiboPassword")
- .HasMaxLength(1000)
- .HasColumnType("TEXT");
-
- b.Property("XiboUsername")
- .HasMaxLength(500)
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("CustomerName");
-
- b.HasIndex("SshHostId");
-
- b.HasIndex("StackName")
- .IsUnique();
-
- b.ToTable("CmsInstances");
- });
-
modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.OperationLog", b =>
{
b.Property("Id")
@@ -188,9 +54,6 @@ namespace OTSSignsOrchestrator.Core.Migrations
b.Property("DurationMs")
.HasColumnType("INTEGER");
- b.Property("InstanceId")
- .HasColumnType("TEXT");
-
b.Property("Message")
.HasMaxLength(2000)
.HasColumnType("TEXT");
@@ -198,6 +61,10 @@ namespace OTSSignsOrchestrator.Core.Migrations
b.Property("Operation")
.HasColumnType("INTEGER");
+ b.Property("StackName")
+ .HasMaxLength(150)
+ .HasColumnType("TEXT");
+
b.Property("Status")
.HasColumnType("INTEGER");
@@ -210,47 +77,15 @@ namespace OTSSignsOrchestrator.Core.Migrations
b.HasKey("Id");
- b.HasIndex("InstanceId");
-
b.HasIndex("Operation");
+ b.HasIndex("StackName");
+
b.HasIndex("Timestamp");
b.ToTable("OperationLogs");
});
- modelBuilder.Entity("OTSSignsOrchestrator.Core.Models.Entities.SecretMetadata", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT");
-
- b.Property("CreatedAt")
- .HasColumnType("TEXT");
-
- b.Property("CustomerName")
- .HasMaxLength(100)
- .HasColumnType("TEXT");
-
- b.Property("IsGlobal")
- .HasColumnType("INTEGER");
-
- b.Property