From 4719ac24b83b9710cf6c02994cdb9ad00984bc37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Thu, 29 May 2025 16:25:02 +0300 Subject: [PATCH] Tenant IsActive --- .../DynamicApi/CreateUpdateTenantInput.cs | 3 +- .../PlatformSignInResultExtensions.cs | 4 + .../ListForms/ListFormDynamicApiAppService.cs | 22 +- .../Seeds/ListFormsSeeder.cs | 42 +- .../Seeds/SeederData.json | 8 +- .../PlatformConsts.cs | 8 + .../PlatformModuleExtensionConfigurator.cs | 10 + .../Extensions/AbpTenantExtensions.cs | 17 + .../Identity/PlatformSignInResult.cs | 4 +- .../PlatformEfCoreEntityExtensionMappings.cs | 11 + .../20250529085543_TenantIsActive.Designer.cs | 3887 +++++++++++++++++ .../20250529085543_TenantIsActive.cs | 29 + .../PlatformDbContextModelSnapshot.cs | 5 + .../Identity/PlatformEventIds.cs | 3 + .../Identity/PlatformLoginResult.cs | 5 + .../Identity/PlatformLoginResultType.cs | 1 + .../Identity/PlatformSignInManager.cs | 36 +- 17 files changed, 4078 insertions(+), 17 deletions(-) create mode 100644 api/src/Kurs.Platform.Domain/Extensions/AbpTenantExtensions.cs create mode 100644 api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.Designer.cs create mode 100644 api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.cs diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateTenantInput.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateTenantInput.cs index 27c1c862..1c0ff595 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateTenantInput.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateTenantInput.cs @@ -5,7 +5,8 @@ namespace Kurs.Platform.ListForms.DynamicApi; public class CreateUpdateTenantInput { public string Name { get; set; } - + public bool IsActive { get; set; } + public Guid? Id { get; set; } public string AdminEmail { get; set; } public string AdminPassword { get; set; } diff --git a/api/src/Kurs.Platform.Application/Identity/PlatformSignInResultExtensions.cs b/api/src/Kurs.Platform.Application/Identity/PlatformSignInResultExtensions.cs index 169f4630..2d922d6b 100644 --- a/api/src/Kurs.Platform.Application/Identity/PlatformSignInResultExtensions.cs +++ b/api/src/Kurs.Platform.Application/Identity/PlatformSignInResultExtensions.cs @@ -50,6 +50,10 @@ public static class PlatformSignInResultExtensions { return PlatformConsts.UserCannotSignInErrors.ShouldChangePasswordPeriodic; } + if (resultP.IsNotAllowed_TenantIsPassive) + { + return PlatformConsts.UserCannotSignInErrors.LoginNotAllowed_TenantIsPassive; + } } /// Added --> diff --git a/api/src/Kurs.Platform.Application/ListForms/ListFormDynamicApiAppService.cs b/api/src/Kurs.Platform.Application/ListForms/ListFormDynamicApiAppService.cs index 3d27e109..0fb92053 100644 --- a/api/src/Kurs.Platform.Application/ListForms/ListFormDynamicApiAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/ListFormDynamicApiAppService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Kurs.Platform.Extensions; using Microsoft.AspNetCore.Authorization; using Volo.Abp; using Volo.Abp.Domain.Entities; @@ -109,7 +110,11 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic public async Task PostTenantInsertAsync(DynamicApiBaseInput input) { var tenant = await tenantManager.CreateAsync(input.Data.Name); - await tenantRepository.InsertAsync(tenant); + + var entity = await tenantRepository.InsertAsync(tenant, autoSave: true); + entity.SetIsActiveTenant(input.Data.IsActive); + + await tenantRepository.UpdateAsync(entity, autoSave: true); } [Authorize(TenantManagementPermissions.Tenants.Update)] @@ -119,14 +124,15 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic { throw new UserFriendlyException(L["RecordNotFound"]); } - var id = Guid.Parse(input.Keys[0].ToString()); - var entity = await tenantRepository.GetAsync(id) ?? throw new EntityNotFoundException(L["RecordNotFound"]); - var tenant = new TenantUpdateDto - { - Name = input.Data.Name ?? entity.Name, - }; - await tenantRepository.UpdateAsync(ObjectMapper.Map(tenant), true); + var id = Guid.Parse(input.Keys[0].ToString()); + var entity = await tenantRepository.GetAsync(id) + ?? throw new EntityNotFoundException(L["RecordNotFound"]); + + await tenantManager.ChangeNameAsync(entity, input.Data.Name); + entity.SetIsActiveTenant(input.Data.IsActive); + + await tenantRepository.UpdateAsync(entity, autoSave: true); } [Authorize(TenantManagementPermissions.Tenants.Delete)] diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs b/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs index ef6b7644..e6c19452 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs @@ -147,9 +147,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency new() { Order=1, ColCount=1, ColSpan=2, ItemType="group", Items = [ new EditingFormItemDto { Order=1, DataField="Name", ColSpan=2, IsRequired=true, EditorType2=EditorTypes.dxTextBox }, - new EditingFormItemDto { Order=2, DataField=IdentityDataSeedContributor.AdminEmailPropertyName, ColSpan=2, IsRequired=true, EditorType2=EditorTypes.dxTextBox }, - new EditingFormItemDto { Order=3, DataField=IdentityDataSeedContributor.AdminPasswordPropertyName, ColSpan=2, IsRequired=true, EditorType2=EditorTypes.dxTextBox }, - new EditingFormItemDto { Order=4, DataField="ConnectionString", ColSpan=2, IsRequired=true, EditorType2=EditorTypes.dxTextArea, EditorOptions="{\"height\":100}" }, + new EditingFormItemDto { Order=2, DataField="IsActive", ColSpan=2, IsRequired=false, EditorType2=EditorTypes.dxCheckBox }, ] } }), @@ -175,6 +173,14 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Value = "@ID", CustomValueType = FieldCustomValueTypeEnum.CustomKey } }), + FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { + new FieldsDefaultValue() { + FieldName = "IsActive", + FieldDbType = DbType.Boolean, + Value = "true", + CustomValueType = FieldCustomValueTypeEnum.Value } + }) + } ); @@ -189,7 +195,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency CultureName = LanguageCodes.En, SourceDbType = DbType.Guid, FieldName = "Id", - Width = 100, + Width = 500, ListOrderNo = 1, Visible = false, IsActive = true, @@ -215,7 +221,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency CultureName = LanguageCodes.En, SourceDbType = DbType.String, FieldName = "Name", - Width = 200, + Width = 800, ListOrderNo = 2, Visible = true, IsActive = true, @@ -234,6 +240,32 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency IsPivot = true }) }, + new ListFormField + { + ListFormCode = listFormTenants.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "IsActive", + Width = 100, + ListOrderNo = 3, + Visible = true, + IsActive = true, + IsDeleted = false, + PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto + { + C = TenantManagementPermissions.Tenants.Create, + R = TenantManagementPermissions.Tenants.Default, + U = TenantManagementPermissions.Tenants.Update, + E = true, + Deny = false + }), + PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto + { + IsPivot = true + }) + }, ]); #endregion #endregion diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json index f87f9fc9..af0edb56 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json @@ -2039,7 +2039,13 @@ "key": "Abp.Identity.User.LockoutManagement.ShouldChangePwOnNextLogin", "en": "Should Change Password On Next Login?", "tr": "Bir Sonraki Girişte Şifre Değiştirilsin mi?" - }, + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.TenantIsPassive", + "en": "Tenant is inactive", + "tr": "Tenant pasif durumdadır" + }, { "resourceName": "Platform", "key": "Abp.Identity.User.LockoutManagement.AccessFailedCount", diff --git a/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs index 67326d41..bbe74794 100644 --- a/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs +++ b/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs @@ -23,6 +23,11 @@ public static class PlatformConsts public const string Abp = "Abp"; } + public static class Tenants + { + public const string IsActive = "IsActive"; + } + public static class AbpIdentity { public const string GroupName = $"{Prefix.Abp}.Identity"; @@ -57,6 +62,7 @@ public static class PlatformConsts public const string ShouldChangePasswordPeriodic = GroupName + ".ShouldChangePasswordPeriodic"; public const string IpRestrictionError = GroupName + ".IpRestrictionError"; public const string LoginEndDateError = GroupName + ".LoginEndDateError"; + public const string TenantIsPassive = GroupName + ".TenantIsPassive"; public const string CaptchaWrongCode = GroupName + ".CaptchaWrongCode"; public const string TwoFactorWrongCode = GroupName + ".TwoFactorWrongCode"; public const string SignOut = GroupName + ".SignOut"; @@ -709,6 +715,8 @@ public static class PlatformConsts public static string LoginNotAllowed_LoginEndDateDue { get; set; } = "UserCannotSignInLoginEndDateDue"; public static string ShouldChangePasswordOnNextLogin { get; set; } = "UserCannotSignInShouldChangePasswordOnNextLogin"; public static string ShouldChangePasswordPeriodic { get; set; } = "UserCannotSignInShouldChangePasswordPeriodic"; + public static string LoginNotAllowed_TenantIsPassive { get; set; } = "UserCannotSignInTenantIsPassive"; + public static string LoginNotAllowed_TenantNotFound { get; set; } = "UserCannotSignInTenantNotFound"; } public static class GridOptions diff --git a/api/src/Kurs.Platform.Domain.Shared/PlatformModuleExtensionConfigurator.cs b/api/src/Kurs.Platform.Domain.Shared/PlatformModuleExtensionConfigurator.cs index e07270e5..69f4558d 100644 --- a/api/src/Kurs.Platform.Domain.Shared/PlatformModuleExtensionConfigurator.cs +++ b/api/src/Kurs.Platform.Domain.Shared/PlatformModuleExtensionConfigurator.cs @@ -77,6 +77,16 @@ public static class PlatformModuleExtensionConfigurator }); }); }); + + ObjectExtensionManager.Instance.Modules() + .ConfigureTenantManagement(tenantConfig => + { + tenantConfig.ConfigureTenant(entity => + { + entity.AddOrUpdateProperty("IsActive"); + }); + }); + /* You can configure extra properties for the * entities defined in the modules used by your application. * diff --git a/api/src/Kurs.Platform.Domain/Extensions/AbpTenantExtensions.cs b/api/src/Kurs.Platform.Domain/Extensions/AbpTenantExtensions.cs new file mode 100644 index 00000000..3b73fd31 --- /dev/null +++ b/api/src/Kurs.Platform.Domain/Extensions/AbpTenantExtensions.cs @@ -0,0 +1,17 @@ +using Volo.Abp.Data; +using Volo.Abp.TenantManagement; + +namespace Kurs.Platform.Extensions; + +public static class AbpTenantExtensions +{ + //IsActive Tenant + public static void SetIsActiveTenant(this Tenant tenant, bool isActive) + { + tenant.SetProperty(PlatformConsts.Tenants.IsActive, isActive); + } + public static bool GetIsActiveTenant(this Tenant tenant) + { + return tenant.GetProperty(PlatformConsts.Tenants.IsActive); + } +} diff --git a/api/src/Kurs.Platform.Domain/Identity/PlatformSignInResult.cs b/api/src/Kurs.Platform.Domain/Identity/PlatformSignInResult.cs index 50e349a5..17eae4c2 100644 --- a/api/src/Kurs.Platform.Domain/Identity/PlatformSignInResult.cs +++ b/api/src/Kurs.Platform.Domain/Identity/PlatformSignInResult.cs @@ -22,11 +22,12 @@ public class PlatformSignInResult : SignInResult /// True if login end date is due, otherwise false. public bool IsNotAllowed_LoginEndDateDue { get; set; } + public bool IsNotAllowed_TenantIsPassive { get; set; } + public bool ShouldChangePasswordOnNextLogin { get; set; } public bool ShouldChangePasswordPeriodic { get; set; } - public override string ToString() { return @@ -35,6 +36,7 @@ public class PlatformSignInResult : SignInResult IsNotAllowed_LoginEndDateDue ? "NotAllowed_LoginEndDateDue" : ShouldChangePasswordOnNextLogin ? "ShouldChangePasswordOnNextLogin" : ShouldChangePasswordPeriodic ? "ShouldChangePasswordPeriodic" : + IsNotAllowed_TenantIsPassive ? "NotAllowed_TenantIsPassive" : base.ToString(); } } diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs b/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs index 6005e974..5c62a06f 100644 --- a/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs +++ b/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using System; using Volo.Abp.Identity; using Volo.Abp.ObjectExtending; +using Volo.Abp.TenantManagement; using Volo.Abp.Threading; namespace Kurs.Platform.EntityFrameworkCore; @@ -44,6 +45,16 @@ public static class PlatformEfCoreEntityExtensionMappings propertyBuilder.HasDefaultValue(null); } ); + + ObjectExtensionManager.Instance + .MapEfCoreProperty( + PlatformConsts.Tenants.IsActive, + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasDefaultValue(true); + } + ); + /* You can configure extra properties for the * entities defined in the modules used by your application. * diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.Designer.cs b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.Designer.cs new file mode 100644 index 00000000..def70b48 --- /dev/null +++ b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.Designer.cs @@ -0,0 +1,3887 @@ +// +using System; +using Kurs.Platform.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Kurs.Platform.Migrations +{ + [DbContext(typeof(PlatformDbContext))] + [Migration("20250529085543_TenantIsActive")] + partial class TenantIsActive + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Kurs.Languages.Entities.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MultipleCultures") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("TwoLetterISOLanguageName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PLanguage", (string)null); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.LanguageKey", b => + { + b.Property("ResourceName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.HasKey("ResourceName", "Key"); + + b.ToTable("PLanguageKey", (string)null); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ResourceName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("ResourceName", "Key"); + + b.ToTable("PLanguageText", (string)null); + }); + + modelBuilder.Entity("Kurs.MailQueue.Domain.Entities.BackgroundWorker_MailQueue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Attachment") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("AttachmentParameter") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .UseCollation("tr-x-icu"); + + b.Property("AwsMessageId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("From") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MailParameter") + .HasMaxLength(8000) + .HasColumnType("character varying(8000)") + .UseCollation("tr-x-icu"); + + b.Property("RelatedRecordId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("SendStatus") + .HasColumnType("boolean"); + + b.Property("SendTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Table") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("TableParameter") + .HasMaxLength(500) + .HasColumnType("character varying(500)") + .UseCollation("tr-x-icu"); + + b.Property("TemplateId") + .HasColumnType("uuid"); + + b.Property("To") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PBackgroundWorker_MailQueue", (string)null); + }); + + modelBuilder.Entity("Kurs.MailQueue.Domain.Entities.BackgroundWorker_MailQueueEvents", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AwsMessageId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Event") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .UseCollation("tr-x-icu"); + + b.Property("EventDate") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MailAddress") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("ResponseDescription") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PBackgroundWorker_MailQueueEvents", (string)null); + }); + + modelBuilder.Entity("Kurs.MailQueue.Domain.Entities.BackgroundWorker_MailQueueTableFormat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("ColumnName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Css") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)") + .UseCollation("tr-x-icu"); + + b.Property("DataFormat") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("DataType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("FooterCss") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)") + .UseCollation("tr-x-icu"); + + b.Property("HeaderCss") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)") + .UseCollation("tr-x-icu"); + + b.Property("IsHidden") + .HasColumnType("boolean"); + + b.Property("IsProtected") + .HasColumnType("boolean"); + + b.Property("Order") + .HasColumnType("smallint"); + + b.Property("SubTotal") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("TableName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("Width") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "TableName", "Order" }, "IX_MailQueueTableFormat") + .IsUnique(); + + b.ToTable("PBackgroundWorker_MailQueueTableFormat", (string)null); + }); + + modelBuilder.Entity("Kurs.Notifications.Entities.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Identifier") + .IsRequired() + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsRead") + .HasColumnType("boolean"); + + b.Property("IsSent") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("NotificationChannel") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .UseCollation("tr-x-icu"); + + b.Property("NotificationRuleId") + .HasColumnType("uuid"); + + b.Property("NotificationType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("ReadTime") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("PNotification", (string)null); + }); + + modelBuilder.Entity("Kurs.Notifications.Entities.NotificationRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Channel") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsCustomized") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsFixed") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("NotificationType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("RecipientId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("RecipientType") + .IsRequired() + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PNotificationRule", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.AiBot", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("BotName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PAiBot", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BackgroundWorker", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AfterSp") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("BeforeSp") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Cron") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("DataSourceCode") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("Options") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("WorkerType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("PBackgroundWorker", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Chart", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AdaptiveLayoutJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("AnimationJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("AnnotationsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ArgumentAxisJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ChartCode") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("CommonAnnotationsSettingsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CommonAxisSettingsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CommonJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CommonPaneSettingsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CommonSeriesSettingsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CrosshairJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CultureName") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasDefaultValue("en") + .UseCollation("tr-x-icu"); + + b.Property("DataSourceCode") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DataSourceJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExportJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsOrganizationUnit") + .HasColumnType("boolean"); + + b.Property("IsTenant") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LegendJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("MarginJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PanesJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PermissionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("RoleId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ScrollBarJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SeriesJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SizeJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("TitleJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("TooltipJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UserId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ValueAxisJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ZoomAndPanJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PChart", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.DataSource", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("ConnectionString") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DataSourceType") + .HasColumnType("integer"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.ToTable("PDataSource", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.GlobalSearch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Group") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("System") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Term") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Url") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Weight") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PGlobalSearch", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.IpRestriction", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("IP") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ResourceId") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .UseCollation("tr-x-icu"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("PIpRestriction", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListForm", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ColumnOptionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CommandColumnJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CustomJsSourcesJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CustomStyleSourcesJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DataSourceCode") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DefaultFilter") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleteCommand") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleteFieldsDefaultValueJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleteServiceAddress") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("EditingFormJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("EditingOptionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("FilterPanelJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("FilterRowJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("FormFieldsDefaultValueJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("GroupPanelJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("HeaderFilterJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Height") + .HasColumnType("integer"); + + b.Property("InsertCommand") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("InsertFieldsDefaultValueJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("InsertServiceAddress") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsOrganizationUnit") + .HasColumnType("boolean"); + + b.Property("IsSubForm") + .HasColumnType("boolean"); + + b.Property("IsTenant") + .HasColumnType("boolean"); + + b.Property("KeyFieldDbSourceType") + .HasColumnType("integer"); + + b.Property("KeyFieldName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ListFormCode") + .IsRequired() + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ListFormType") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Name") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PageSize") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(10); + + b.Property("PagerOptionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PermissionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SearchPanelJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SelectCommand") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SelectCommandType") + .HasColumnType("integer"); + + b.Property("SelectFieldsDefaultValueJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SelectionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SortMode") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("StateStoringJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SubFormsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("TableName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Title") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UpdateCommand") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UpdateFieldsDefaultValueJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UpdateServiceAddress") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Width") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("PListForm", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListFormCustomization", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CustomizationData") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CustomizationType") + .HasColumnType("integer"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("FilterName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ListFormCode") + .IsRequired() + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("RoleId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UserId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("ListFormCode"); + + b.ToTable("PListFormCustomization", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListFormField", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Alignment") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("AllowSearch") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("BandName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CaptionName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ColumnCssClass") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ColumnCssValue") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ColumnCustomizationJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ColumnFilterJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ColumnHeaderJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ColumnStylingJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("EditingJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("EditorOptions") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("FieldName") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("Format") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("GroupSummaryJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("GroupingJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JoinTableJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ListFormCode") + .IsRequired() + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ListOrderNo") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(30); + + b.Property("LookupJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PermissionJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PivotSettingsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("RoleId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SortDirection") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SortIndex") + .HasColumnType("integer"); + + b.Property("SourceDbType") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(16); + + b.Property("TotalSummaryJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("UserId") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ValidationRuleJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Visible") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("Width") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(100); + + b.HasKey("Id"); + + b.HasIndex("ListFormCode"); + + b.ToTable("PListFormField", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Menu", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CssClass") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("CultureName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("ElementId") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Icon") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsDisabled") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Order") + .HasColumnType("integer"); + + b.Property("ParentCode") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("RequiredPermissionName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("RoleId") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("Target") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Url") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("UserId") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PMenu", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.PublicApi", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DataSourceCode") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Method") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Name") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ParametersJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PermissionsJson") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Sql") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Url") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PPublicApi", (string)null); + }); + + modelBuilder.Entity("Kurs.Settings.Entities.SettingDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DataType") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .UseCollation("tr-x-icu"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)") + .UseCollation("tr-x-icu"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("DescriptionKey") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .UseCollation("tr-x-icu"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MainGroupKey") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("NameKey") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("Order") + .HasColumnType("integer"); + + b.Property("Providers") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("RequiredPermissionName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("SelectOptions") + .HasColumnType("text"); + + b.Property("SubGroupKey") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.ToTable("PSettingDefinition", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName") + .UseCollation("tr-x-icu"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo") + .UseCollation("tr-x-icu"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId") + .UseCollation("tr-x-icu"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress") + .UseCollation("tr-x-icu"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName") + .UseCollation("tr-x-icu"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments") + .UseCollation("tr-x-icu"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId") + .UseCollation("tr-x-icu"); + + b.Property("Exceptions") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp with time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod") + .UseCollation("tr-x-icu"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName") + .UseCollation("tr-x-icu"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName") + .UseCollation("tr-x-icu"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url") + .UseCollation("tr-x-icu"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName") + .UseCollation("tr-x-icu"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters") + .UseCollation("tr-x-icu"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId") + .UseCollation("tr-x-icu"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue") + .UseCollation("tr-x-icu"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue") + .UseCollation("tr-x-icu"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName") + .UseCollation("tr-x-icu"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)") + .UseCollation("tr-x-icu"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("LastTryTime") + .HasColumnType("timestamp with time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .UseCollation("tr-x-icu"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .UseCollation("tr-x-icu"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .UseCollation("tr-x-icu"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .UseCollation("tr-x-icu"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .UseCollation("tr-x-icu"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)") + .UseCollation("tr-x-icu"); + + b.Property("LastAccessed") + .HasColumnType("timestamp with time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("SignedIn") + .HasColumnType("timestamp with time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email") + .UseCollation("tr-x-icu"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("IsVerified") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("LoginEndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name") + .UseCollation("tr-x-icu"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail") + .UseCollation("tr-x-icu"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName") + .UseCollation("tr-x-icu"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash") + .UseCollation("tr-x-icu"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber") + .UseCollation("tr-x-icu"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("RocketUsername") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp") + .UseCollation("tr-x-icu"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp with time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code") + .UseCollation("tr-x-icu"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName") + .UseCollation("tr-x-icu"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("ClientSecret") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("ClientUri") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DisplayNames") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Permissions") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Properties") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("RedirectUris") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Requirements") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Settings") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Scopes") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)") + .UseCollation("tr-x-icu"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Descriptions") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DisplayName") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("DisplayNames") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .UseCollation("tr-x-icu"); + + b.Property("Properties") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Resources") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AuthorizationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("Properties") + .HasColumnType("text") + .UseCollation("tr-x-icu"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .UseCollation("tr-x-icu"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)") + .UseCollation("tr-x-icu"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)") + .UseCollation("tr-x-icu"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .UseCollation("tr-x-icu"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .UseCollation("tr-x-icu"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .UseCollation("tr-x-icu"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp") + .UseCollation("tr-x-icu"); + + b.Property("CreationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .UseCollation("tr-x-icu"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .UseCollation("tr-x-icu"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.LanguageText", b => + { + b.HasOne("Kurs.Languages.Entities.LanguageKey", null) + .WithMany("Texts") + .HasForeignKey("ResourceName", "Key") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListFormCustomization", b => + { + b.HasOne("Kurs.Platform.Entities.ListForm", null) + .WithMany() + .HasForeignKey("ListFormCode") + .HasPrincipalKey("ListFormCode") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListFormField", b => + { + b.HasOne("Kurs.Platform.Entities.ListForm", null) + .WithMany() + .HasForeignKey("ListFormCode") + .HasPrincipalKey("ListFormCode") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.LanguageKey", b => + { + b.Navigation("Texts"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.cs b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.cs new file mode 100644 index 00000000..db463158 --- /dev/null +++ b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250529085543_TenantIsActive.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Kurs.Platform.Migrations +{ + /// + public partial class TenantIsActive : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "IsActive", + table: "AbpTenants", + type: "boolean", + nullable: false, + defaultValue: false); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "IsActive", + table: "AbpTenants"); + } + } +} diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index feb707cd..e9057809 100644 --- a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -3603,6 +3603,11 @@ namespace Kurs.Platform.Migrations .HasColumnType("text") .HasColumnName("ExtraProperties"); + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + b.Property("IsDeleted") .ValueGeneratedOnAdd() .HasColumnType("boolean") diff --git a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformEventIds.cs b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformEventIds.cs index c4572da2..c67976f5 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformEventIds.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformEventIds.cs @@ -19,4 +19,7 @@ public static class PlatformEventIds public static EventId ShouldChangePasswordPeriodic = new(16, PlatformConsts.UserCannotSignInErrors.ShouldChangePasswordPeriodic); + public static EventId UserCannotSignInTenantIsPassive = + new(17, PlatformConsts.UserCannotSignInErrors.LoginNotAllowed_TenantIsPassive); } + diff --git a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResult.cs b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResult.cs index f0c2be1d..b032d1ea 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResult.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResult.cs @@ -54,6 +54,11 @@ public class PlatformLoginResult : AbpLoginResult PResult = PlatformLoginResultType.LoginEndDateDue; Description = L[PlatformConsts.AbpIdentity.User.LoginEndDateError]; } + else if (resultP.IsNotAllowed_TenantIsPassive) + { + PResult = PlatformLoginResultType.TenantIsPassive; + Description = L[PlatformConsts.AbpIdentity.User.TenantIsPassive]; + } } else { diff --git a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResultType.cs b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResultType.cs index 8974ce46..ba2c89db 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResultType.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformLoginResultType.cs @@ -14,4 +14,5 @@ public enum PlatformLoginResultType : byte NotAllowedIp, LoginEndDateDue, ShowCaptcha, + TenantIsPassive, } diff --git a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformSignInManager.cs b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformSignInManager.cs index 3933858f..163160f3 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformSignInManager.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Identity/PlatformSignInManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data.Common; using System.Linq; using System.Threading.Tasks; using Kurs.Platform.Entities; @@ -13,6 +14,7 @@ using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Volo.Abp.Identity.AspNetCore; using Volo.Abp.Settings; +using Volo.Abp.TenantManagement; using Volo.Abp.Timing; using IdentityUser = Volo.Abp.Identity.IdentityUser; using SignInResult = Microsoft.AspNetCore.Identity.SignInResult; @@ -28,6 +30,7 @@ public class PlatformSignInManager : AbpSignInManager, IPlatformSignInManager { private readonly IClock clock; private readonly IRepository repositoryIp; + private readonly ITenantRepository tenantRepository; private readonly IdentityUserManager userManager; public PlatformSignInManager( @@ -41,7 +44,8 @@ public class PlatformSignInManager : AbpSignInManager, IPlatformSignInManager IOptions options, ISettingProvider settingProvider, IClock clock, - IRepository repositoryIp + IRepository repositoryIp, + ITenantRepository tenantRepository ) : base( userManager, contextAccessor, @@ -55,6 +59,7 @@ public class PlatformSignInManager : AbpSignInManager, IPlatformSignInManager { this.clock = clock; this.repositoryIp = repositoryIp; + this.tenantRepository = tenantRepository; this.userManager = userManager; } @@ -82,6 +87,10 @@ public class PlatformSignInManager : AbpSignInManager, IPlatformSignInManager { return new PlatformSignInResult() { IsNotAllowed_NotAllowedIp = true }; } + if (!await IsTenantActiveAsync(user)) + { + return new PlatformSignInResult() { IsNotAllowed_TenantIsPassive = true }; + } } else { @@ -100,6 +109,31 @@ public class PlatformSignInManager : AbpSignInManager, IPlatformSignInManager return result; } + /// + /// Tenant IsActive + /// + private async Task IsTenantActiveAsync(IdentityUser user) + { + if (!user.TenantId.HasValue) + { + return true; + } + + var tenant = await tenantRepository.FindAsync(user.TenantId.Value); + if (tenant == null) + { + return false; + } + + if (!tenant.GetIsActiveTenant()) + { + Logger.LogWarning(PlatformEventIds.UserCannotSignInTenantIsPassive, "Tenant is inactive."); + return false; + } + + return true; + } + /// /// Used to prevent login for additional scenarios; /// Account Not Verified