gateway api fixes
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user