gateway api fixes

This commit is contained in:
Nils Blomgren
2026-05-21 16:57:50 +02:00
parent 8b94fb8826
commit e0f967482e
68 changed files with 44082 additions and 437 deletions

View File

@@ -337,6 +337,9 @@ namespace EntKube.Web.Data.Migrations.Sqlite
.HasMaxLength(10)
.HasColumnType("TEXT");
b.Property<int>("RetentionDays")
.HasColumnType("INTEGER");
b.Property<int>("Status")
.HasColumnType("INTEGER");
@@ -444,6 +447,46 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.ToTable("CustomerAccesses");
});
modelBuilder.Entity("EntKube.Web.Data.DatabaseBinding", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<Guid>("AppDeploymentId")
.HasColumnType("TEXT");
b.Property<Guid?>("CnpgDatabaseId")
.HasColumnType("TEXT");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT");
b.Property<string>("KubernetesSecretName")
.IsRequired()
.HasMaxLength(253)
.HasColumnType("TEXT");
b.Property<DateTime?>("LastSyncedAt")
.HasColumnType("TEXT");
b.Property<Guid?>("MongoDatabaseId")
.HasColumnType("TEXT");
b.Property<bool>("SyncEnabled")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("AppDeploymentId");
b.HasIndex("CnpgDatabaseId");
b.HasIndex("MongoDatabaseId");
b.ToTable("DatabaseBindings");
});
modelBuilder.Entity("EntKube.Web.Data.DeploymentManifest", b =>
{
b.Property<Guid>("Id")
@@ -674,6 +717,140 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.ToTable("GroupMemberships");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakBackup", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<DateTime?>("CompletedAt")
.HasColumnType("TEXT");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT");
b.Property<Guid>("KeycloakRealmId")
.HasColumnType("TEXT");
b.Property<string>("LastError")
.HasColumnType("TEXT");
b.Property<string>("ObjectKey")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<string>("RealmName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("TEXT");
b.Property<long>("SizeBytes")
.HasColumnType("INTEGER");
b.Property<int>("Status")
.HasColumnType("INTEGER");
b.Property<Guid>("StorageLinkId")
.HasColumnType("TEXT");
b.Property<Guid>("TenantId")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("KeycloakRealmId");
b.HasIndex("StorageLinkId");
b.ToTable("KeycloakBackups");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakComponentConfig", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<string>("AdminUrl")
.HasMaxLength(500)
.HasColumnType("TEXT");
b.Property<string>("AdminUsername")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("TEXT");
b.Property<Guid>("ClusterComponentId")
.HasColumnType("TEXT");
b.Property<Guid?>("CnpgDatabaseId")
.HasColumnType("TEXT");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT");
b.Property<Guid>("TenantId")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("ClusterComponentId");
b.HasIndex("CnpgDatabaseId");
b.HasIndex("TenantId");
b.ToTable("KeycloakComponentConfigs");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakRealm", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<string>("AccountTheme")
.HasColumnType("TEXT");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("TEXT");
b.Property<bool>("Enabled")
.HasColumnType("INTEGER");
b.Property<Guid>("KeycloakComponentConfigId")
.HasColumnType("TEXT");
b.Property<Guid?>("LinkedAppId")
.HasColumnType("TEXT");
b.Property<string>("LoginTheme")
.HasColumnType("TEXT");
b.Property<string>("RealmName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("TEXT");
b.Property<Guid>("TenantId")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("LinkedAppId");
b.HasIndex("KeycloakComponentConfigId", "RealmName")
.IsUnique();
b.ToTable("KeycloakRealms");
});
modelBuilder.Entity("EntKube.Web.Data.KubernetesCluster", b =>
{
b.Property<Guid>("Id")
@@ -715,6 +892,141 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.ToTable("KubernetesClusters");
});
modelBuilder.Entity("EntKube.Web.Data.MongoBackup", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<DateTime?>("CompletedAt")
.HasColumnType("TEXT");
b.Property<Guid>("MongoClusterId")
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(253)
.HasColumnType("TEXT");
b.Property<long?>("SizeBytes")
.HasColumnType("INTEGER");
b.Property<DateTime>("StartedAt")
.HasColumnType("TEXT");
b.Property<int>("Status")
.HasColumnType("INTEGER");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("MongoClusterId", "Name")
.IsUnique();
b.ToTable("MongoBackups");
});
modelBuilder.Entity("EntKube.Web.Data.MongoCluster", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<string>("BackupSchedule")
.HasMaxLength(100)
.HasColumnType("TEXT");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT");
b.Property<Guid>("KubernetesClusterId")
.HasColumnType("TEXT");
b.Property<string>("LastError")
.HasColumnType("TEXT");
b.Property<int>("Members")
.HasColumnType("INTEGER");
b.Property<string>("MongoVersion")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(63)
.HasColumnType("TEXT");
b.Property<string>("Namespace")
.IsRequired()
.HasMaxLength(63)
.HasColumnType("TEXT");
b.Property<int>("RetentionDays")
.HasColumnType("INTEGER");
b.Property<int>("Status")
.HasColumnType("INTEGER");
b.Property<Guid?>("StorageLinkId")
.HasColumnType("TEXT");
b.Property<string>("StorageSize")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT");
b.Property<Guid>("TenantId")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("StorageLinkId");
b.HasIndex("TenantId");
b.HasIndex("KubernetesClusterId", "Name", "Namespace")
.IsUnique();
b.ToTable("MongoClusters");
});
modelBuilder.Entity("EntKube.Web.Data.MongoDatabase", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT");
b.Property<Guid>("MongoClusterId")
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(63)
.HasColumnType("TEXT");
b.Property<string>("Owner")
.IsRequired()
.HasColumnType("TEXT");
b.Property<int>("Status")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("MongoClusterId", "Name")
.IsUnique();
b.ToTable("MongoDatabases");
});
modelBuilder.Entity("EntKube.Web.Data.OpenStackConnection", b =>
{
b.Property<Guid>("Id")
@@ -983,6 +1295,12 @@ namespace EntKube.Web.Data.Migrations.Sqlite
.HasMaxLength(253)
.HasColumnType("TEXT");
b.Property<Guid?>("MongoClusterId")
.HasColumnType("TEXT");
b.Property<Guid?>("MongoDatabaseId")
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(200)
@@ -1015,6 +1333,10 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.HasIndex("ComponentId");
b.HasIndex("MongoClusterId");
b.HasIndex("MongoDatabaseId");
b.HasIndex("StorageLinkId");
b.HasIndex("VaultId", "AppId", "Name")
@@ -1300,6 +1622,31 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.Navigation("User");
});
modelBuilder.Entity("EntKube.Web.Data.DatabaseBinding", b =>
{
b.HasOne("EntKube.Web.Data.AppDeployment", "AppDeployment")
.WithMany("DatabaseBindings")
.HasForeignKey("AppDeploymentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntKube.Web.Data.CnpgDatabase", "CnpgDatabase")
.WithMany("DatabaseBindings")
.HasForeignKey("CnpgDatabaseId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("EntKube.Web.Data.MongoDatabase", "MongoDatabase")
.WithMany("DatabaseBindings")
.HasForeignKey("MongoDatabaseId")
.OnDelete(DeleteBehavior.Cascade);
b.Navigation("AppDeployment");
b.Navigation("CnpgDatabase");
b.Navigation("MongoDatabase");
});
modelBuilder.Entity("EntKube.Web.Data.DeploymentManifest", b =>
{
b.HasOne("EntKube.Web.Data.AppDeployment", "Deployment")
@@ -1381,6 +1728,69 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.Navigation("User");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakBackup", b =>
{
b.HasOne("EntKube.Web.Data.KeycloakRealm", "Realm")
.WithMany("Backups")
.HasForeignKey("KeycloakRealmId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntKube.Web.Data.StorageLink", "StorageLink")
.WithMany()
.HasForeignKey("StorageLinkId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Realm");
b.Navigation("StorageLink");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakComponentConfig", b =>
{
b.HasOne("EntKube.Web.Data.ClusterComponent", "ClusterComponent")
.WithMany()
.HasForeignKey("ClusterComponentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntKube.Web.Data.CnpgDatabase", "CnpgDatabase")
.WithMany()
.HasForeignKey("CnpgDatabaseId")
.OnDelete(DeleteBehavior.SetNull);
b.HasOne("EntKube.Web.Data.Tenant", "Tenant")
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ClusterComponent");
b.Navigation("CnpgDatabase");
b.Navigation("Tenant");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakRealm", b =>
{
b.HasOne("EntKube.Web.Data.KeycloakComponentConfig", "ComponentConfig")
.WithMany("Realms")
.HasForeignKey("KeycloakComponentConfigId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntKube.Web.Data.App", "LinkedApp")
.WithMany()
.HasForeignKey("LinkedAppId")
.OnDelete(DeleteBehavior.SetNull);
b.Navigation("ComponentConfig");
b.Navigation("LinkedApp");
});
modelBuilder.Entity("EntKube.Web.Data.KubernetesCluster", b =>
{
b.HasOne("EntKube.Web.Data.Environment", "Environment")
@@ -1400,6 +1810,54 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.Navigation("Tenant");
});
modelBuilder.Entity("EntKube.Web.Data.MongoBackup", b =>
{
b.HasOne("EntKube.Web.Data.MongoCluster", "MongoCluster")
.WithMany("Backups")
.HasForeignKey("MongoClusterId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("MongoCluster");
});
modelBuilder.Entity("EntKube.Web.Data.MongoCluster", b =>
{
b.HasOne("EntKube.Web.Data.KubernetesCluster", "KubernetesCluster")
.WithMany()
.HasForeignKey("KubernetesClusterId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntKube.Web.Data.StorageLink", "StorageLink")
.WithMany()
.HasForeignKey("StorageLinkId")
.OnDelete(DeleteBehavior.SetNull);
b.HasOne("EntKube.Web.Data.Tenant", "Tenant")
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("KubernetesCluster");
b.Navigation("StorageLink");
b.Navigation("Tenant");
});
modelBuilder.Entity("EntKube.Web.Data.MongoDatabase", b =>
{
b.HasOne("EntKube.Web.Data.MongoCluster", "MongoCluster")
.WithMany("Databases")
.HasForeignKey("MongoClusterId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("MongoCluster");
});
modelBuilder.Entity("EntKube.Web.Data.OpenStackConnection", b =>
{
b.HasOne("EntKube.Web.Data.Tenant", "Tenant")
@@ -1533,6 +1991,16 @@ namespace EntKube.Web.Data.Migrations.Sqlite
.HasForeignKey("ComponentId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("EntKube.Web.Data.MongoCluster", "MongoCluster")
.WithMany()
.HasForeignKey("MongoClusterId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("EntKube.Web.Data.MongoDatabase", "MongoDatabase")
.WithMany()
.HasForeignKey("MongoDatabaseId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("EntKube.Web.Data.StorageLink", "StorageLink")
.WithMany()
.HasForeignKey("StorageLinkId");
@@ -1549,6 +2017,10 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.Navigation("Component");
b.Navigation("MongoCluster");
b.Navigation("MongoDatabase");
b.Navigation("StorageLink");
b.Navigation("Vault");
@@ -1616,6 +2088,8 @@ namespace EntKube.Web.Data.Migrations.Sqlite
modelBuilder.Entity("EntKube.Web.Data.AppDeployment", b =>
{
b.Navigation("DatabaseBindings");
b.Navigation("Manifests");
b.Navigation("Resources");
@@ -1639,6 +2113,11 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.Navigation("Databases");
});
modelBuilder.Entity("EntKube.Web.Data.CnpgDatabase", b =>
{
b.Navigation("DatabaseBindings");
});
modelBuilder.Entity("EntKube.Web.Data.Customer", b =>
{
b.Navigation("Apps");
@@ -1661,11 +2140,33 @@ namespace EntKube.Web.Data.Migrations.Sqlite
b.Navigation("Memberships");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakComponentConfig", b =>
{
b.Navigation("Realms");
});
modelBuilder.Entity("EntKube.Web.Data.KeycloakRealm", b =>
{
b.Navigation("Backups");
});
modelBuilder.Entity("EntKube.Web.Data.KubernetesCluster", b =>
{
b.Navigation("Components");
});
modelBuilder.Entity("EntKube.Web.Data.MongoCluster", b =>
{
b.Navigation("Backups");
b.Navigation("Databases");
});
modelBuilder.Entity("EntKube.Web.Data.MongoDatabase", b =>
{
b.Navigation("DatabaseBindings");
});
modelBuilder.Entity("EntKube.Web.Data.OpenStackConnection", b =>
{
b.Navigation("StorageLinks");