From 954555c375164c91c1eed76ad7c153b798f5e185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 29 Jun 2025 00:34:28 +0300 Subject: [PATCH] =?UTF-8?q?Dinamik=20Route=20sistemi=20geli=C5=9Ftirildi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Routes/RouteDto.cs | 14 + .../Routes/RouteAppService.cs | 30 + .../Routes/RouteAutoMapperProfile.cs | 14 + .../Seeds/ListFormsSeeder.cs | 22 +- .../Seeds/PlatformDataSeeder.cs | 23 +- .../Seeds/SeederData.json | 582 +- .../Seeds/SeederDto.cs | 10 + .../Entities/BlogCategory.cs | 1 - .../Kurs.Platform.Domain/Entities/BlogPost.cs | 1 - .../Kurs.Platform.Domain/Entities/Route.cs | 22 + .../EntityFrameworkCore/PlatformDbContext.cs | 33 +- .../20250628190318_AddRoutes.Designer.cs | 5193 +++++++++++++++++ .../Migrations/20250628190318_AddRoutes.cs | 383 ++ .../PlatformDbContextModelSnapshot.cs | 83 +- ui/dev-dist/sw.js | 2 +- ui/src/App.tsx | 16 +- .../layouts/AuthLayout/AuthLayout.tsx | 1 - ui/src/components/layouts/ClassicLayout.tsx | 4 +- ui/src/components/template/AiAssistant.tsx | 3 +- ui/src/components/template/Footer.tsx | 6 +- ui/src/components/template/Notification.tsx | 4 +- ui/src/components/template/UserDropdown.tsx | 6 +- ui/src/configs/app.config.ts | 6 +- ui/src/configs/routes.config/adminRoutes.tsx | 74 - ui/src/configs/routes.config/authRoute.tsx | 82 - ui/src/configs/routes.config/index.ts | 1 - ui/src/configs/routes.config/routes.config.ts | 84 - ui/src/constants/route.constant.ts | 54 - ui/src/proxy/routes/index.ts | 1 + ui/src/proxy/routes/models.ts | 10 + ui/src/routes/dynamicRouteLoader.tsx | 46 + ui/src/routes/dynamicRouter.tsx | 69 + ui/src/routes/dynamicRoutesContext.tsx | 54 + ui/src/routes/route.constant.ts | 53 + ui/src/services/route.service.ts | 18 + ui/src/store/base.model.ts | 2 +- ui/src/utils/hooks/useAuth.ts | 4 +- ui/src/views/NotFound.tsx | 13 + ui/src/views/Views.tsx | 49 +- ui/src/views/admin/activityLog/index.ts | 3 - ui/src/views/admin/identity/Roles/index.ts | 3 - ui/src/views/admin/identity/Users/index.ts | 3 - ui/src/views/admin/listForm/Wizard.tsx | 4 +- .../Roles => role-management}/Roles.tsx | 0 .../RolesPermission.tsx | 0 ui/src/views/admin/tenant-management/index.ts | 3 - .../Users => user-management}/Details.tsx | 0 .../Users => user-management}/Users.tsx | 0 .../UsersPermission.tsx | 0 .../views/ai/LoadAiPostsFromLocalStorage.tsx | 2 +- ui/src/views/auth/ExtendLogin.tsx | 4 +- ui/src/views/auth/ForgotPassword.tsx | 4 +- ui/src/views/auth/Login.tsx | 12 +- ui/src/views/auth/Register.tsx | 4 +- ui/src/views/auth/ResetPassword.tsx | 6 +- ui/src/views/auth/SendConfirmationCode.tsx | 4 +- ui/src/views/auth/{Settings => }/Settings.tsx | 18 +- ui/src/views/auth/Settings/index.ts | 3 - .../Profile.tsx => settings/General.tsx} | 8 +- .../NotificationSettings.tsx | 0 .../components => settings}/Password.tsx | 4 +- .../DialogContext/DialogShowComponent.tsx | 4 +- .../components => shared}/FormDesription.tsx | 0 .../components => shared}/FormRow.tsx | 0 64 files changed, 6626 insertions(+), 536 deletions(-) create mode 100644 api/src/Kurs.Platform.Application.Contracts/Routes/RouteDto.cs create mode 100644 api/src/Kurs.Platform.Application/Routes/RouteAppService.cs create mode 100644 api/src/Kurs.Platform.Application/Routes/RouteAutoMapperProfile.cs create mode 100644 api/src/Kurs.Platform.Domain/Entities/Route.cs create mode 100644 api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.Designer.cs create mode 100644 api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.cs delete mode 100644 ui/src/configs/routes.config/adminRoutes.tsx delete mode 100644 ui/src/configs/routes.config/authRoute.tsx delete mode 100644 ui/src/configs/routes.config/index.ts delete mode 100644 ui/src/configs/routes.config/routes.config.ts delete mode 100644 ui/src/constants/route.constant.ts create mode 100644 ui/src/proxy/routes/index.ts create mode 100644 ui/src/proxy/routes/models.ts create mode 100644 ui/src/routes/dynamicRouteLoader.tsx create mode 100644 ui/src/routes/dynamicRouter.tsx create mode 100644 ui/src/routes/dynamicRoutesContext.tsx create mode 100644 ui/src/routes/route.constant.ts create mode 100644 ui/src/services/route.service.ts create mode 100644 ui/src/views/NotFound.tsx delete mode 100644 ui/src/views/admin/activityLog/index.ts delete mode 100644 ui/src/views/admin/identity/Roles/index.ts delete mode 100644 ui/src/views/admin/identity/Users/index.ts rename ui/src/views/admin/{identity/Roles => role-management}/Roles.tsx (100%) rename ui/src/views/admin/{identity/Roles => role-management}/RolesPermission.tsx (100%) delete mode 100644 ui/src/views/admin/tenant-management/index.ts rename ui/src/views/admin/{identity/Users => user-management}/Details.tsx (100%) rename ui/src/views/admin/{identity/Users => user-management}/Users.tsx (100%) rename ui/src/views/admin/{identity/Users => user-management}/UsersPermission.tsx (100%) rename ui/src/views/auth/{Settings => }/Settings.tsx (81%) delete mode 100644 ui/src/views/auth/Settings/index.ts rename ui/src/views/auth/{Settings/components/Profile.tsx => settings/General.tsx} (98%) rename ui/src/views/auth/{Settings/components => settings}/NotificationSettings.tsx (100%) rename ui/src/views/auth/{Settings/components => settings}/Password.tsx (98%) rename ui/src/views/{auth/Settings/components => shared}/FormDesription.tsx (100%) rename ui/src/views/{auth/Settings/components => shared}/FormRow.tsx (100%) diff --git a/api/src/Kurs.Platform.Application.Contracts/Routes/RouteDto.cs b/api/src/Kurs.Platform.Application.Contracts/Routes/RouteDto.cs new file mode 100644 index 00000000..efcfba23 --- /dev/null +++ b/api/src/Kurs.Platform.Application.Contracts/Routes/RouteDto.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Kurs.Platform.Routes +{ + public class RouteDto : EntityDto + { + public string Key { get; set; } + public string Path { get; set; } + public string ComponentPath { get; set; } + public string RouteType { get; set; } + public string[] Authority { get; set; } + } +} diff --git a/api/src/Kurs.Platform.Application/Routes/RouteAppService.cs b/api/src/Kurs.Platform.Application/Routes/RouteAppService.cs new file mode 100644 index 00000000..32012ef7 --- /dev/null +++ b/api/src/Kurs.Platform.Application/Routes/RouteAppService.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Kurs.Platform.Entities; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; + +namespace Kurs.Platform.Routes +{ + public class RouteAppService : PlatformAppService + { + private readonly IRepository _routeRepository; + + public RouteAppService(IRepository routeRepository) + { + _routeRepository = routeRepository; + } + + public async Task> GetListAsync() + { + var items = await _routeRepository.GetListAsync(); + if (items is null) + { + throw new EntityNotFoundException(L["RecordNotFound"]); + } + + return ObjectMapper.Map, List>(items); + } + } +} diff --git a/api/src/Kurs.Platform.Application/Routes/RouteAutoMapperProfile.cs b/api/src/Kurs.Platform.Application/Routes/RouteAutoMapperProfile.cs new file mode 100644 index 00000000..4d8b0a4f --- /dev/null +++ b/api/src/Kurs.Platform.Application/Routes/RouteAutoMapperProfile.cs @@ -0,0 +1,14 @@ +using AutoMapper; +using Kurs.Platform.Entities; +using Kurs.Platform.Routes; + +namespace Kurs.Platform; + +public class RouteAutoMapperProfile : Profile +{ + public RouteAutoMapperProfile() + { + // Blog mappings + CreateMap(); + } +} diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs b/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs index 5ce54202..57e14986 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormsSeeder.cs @@ -1609,7 +1609,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Text ="Detail", UrlTarget="_blank", AuthName=PlatformConsts.IdentityPermissions.Users.Update, - Url="/admin/identity/users/detail/@Id" + Url="/admin/users/detail/@Id" }, new CommandColumnDto() { Hint = "Permission", @@ -1970,7 +1970,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Text ="Manage", UrlTarget="_blank", AuthName = AppCodes.Languages.Language + ".Update", - Url=$"/form/{ListFormCodes.Forms.FormLanguage}/@Id" + Url=$"/admin/form/{ListFormCodes.Forms.FormLanguage}/@Id" }, }), } @@ -3139,14 +3139,14 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Text ="Manage", UrlTarget="_blank", AuthName=AppCodes.Listforms.Listform + ".Update", - Url="/admin/listform/edit/@ListFormCode" + Url="/saas/listform/edit/@ListFormCode" }, new() { Hint = "Göster", Text ="Göster", UrlTarget="_blank", AuthName=AppCodes.Listforms.Listform, - Url="/list/@ListFormCode" + Url="/admin/list/@ListFormCode" } }), StateStoringJson = JsonSerializer.Serialize(new StateStoringDto @@ -4632,14 +4632,14 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Text ="Manage", UrlTarget="_blank", AuthName=AppCodes.Listforms.Chart + ".Update", - Url="/admin/chart/edit/@ChartCode" + Url="/saas/chart/edit/@ChartCode" }, new() { Hint = "Göster", Text ="Göster", UrlTarget="_blank", AuthName=AppCodes.Listforms.Chart, - Url="/chart/@ChartCode" + Url="/admin/chart/@ChartCode" } }), } @@ -10457,7 +10457,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Text ="Manage", UrlTarget="_blank", AuthName = AppCodes.Definitions.SkillType + ".Update", - Url=$"/form/{ListFormCodes.Forms.FormUomCategory}/@Id" + Url=$"/admin/form/{ListFormCodes.Forms.FormUomCategory}/@Id" }, }), }); @@ -10644,7 +10644,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency Text ="Manage", UrlTarget="_blank", AuthName = AppCodes.Definitions.UomCategory + ".Update", - Url=$"/form/{ListFormCodes.Forms.FormUomCategory}/@Id" + Url=$"/admin/form/{ListFormCodes.Forms.FormUomCategory}/@Id" }, }), }); @@ -10717,7 +10717,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency IsOrganizationUnit = false, Description = AppCodes.BlogManagement.BlogCategory, SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = SelectCommandByTableName("BlogCategories"), + SelectCommand = SelectCommandByTableName("BlogCategory"), KeyFieldName = "Id", KeyFieldDbSourceType = DbType.Guid, DefaultFilter = "\"IsDeleted\" = 'false'", @@ -11015,7 +11015,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency } #endregion - #region BlogPosts + #region BlogPost if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == ListFormCodes.Lists.BlogPosts)) { var listFormBlogPosts = await _listFormRepository.InsertAsync( @@ -11031,7 +11031,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency IsOrganizationUnit = false, Description = AppCodes.BlogManagement.BlogPosts, SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = SelectCommandByTableName("BlogPosts"), + SelectCommand = SelectCommandByTableName("BlogPost"), KeyFieldName = "Id", KeyFieldDbSourceType = DbType.Guid, DefaultFilter = "\"IsDeleted\" = 'false'", diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/PlatformDataSeeder.cs b/api/src/Kurs.Platform.DbMigrator/Seeds/PlatformDataSeeder.cs index fab645a4..d425fb2b 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/PlatformDataSeeder.cs +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/PlatformDataSeeder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; @@ -11,6 +12,7 @@ using Kurs.Platform.Entities; using Kurs.Platform.Enums; using Kurs.Platform.Forum; using Kurs.Platform.ListForms; +using Kurs.Platform.Routes; using Kurs.Platform.Seeds; using Kurs.Settings.Entities; using Microsoft.Extensions.Configuration; @@ -53,6 +55,7 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency private readonly IRepository _blogPostsRepository; private readonly IRepository _forumCategoryRepository; private readonly IRepository _aiBotRepository; + private readonly IRepository _RouteRepository; public PlatformDataSeeder( IRepository languages, @@ -82,7 +85,8 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency IRepository blogCategoryRepository, IRepository blogPostsRepository, IRepository forumCategoryRepository, - IRepository aiBotRepository + IRepository aiBotRepository, + IRepository RouteRepository ) { _languages = languages; @@ -113,6 +117,7 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency _blogPostsRepository = blogPostsRepository; _forumCategoryRepository = forumCategoryRepository; _aiBotRepository = aiBotRepository; + _RouteRepository = RouteRepository; } private static IConfigurationRoot BuildConfiguration() @@ -631,5 +636,21 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency )); } } + + foreach (var item in items.Routes) + { + var exists = await _RouteRepository.AnyAsync(x => x.Key == item.Key); + + if (!exists) + { + await _RouteRepository.InsertAsync(new Route( + item.Key, + item.Path, + item.ComponentPath, + item.RouteType, + item.Authority ?? [] + )); + } + } } } diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json index e46a25da..bd1ee463 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json @@ -774,7 +774,7 @@ "key": "App.Forum.PostManagement.DeletePost", "en": "Delete Post", "tr": "Yazıyı Sil" - }, + }, { "resourceName": "Platform", "key": "App.Forum.PostManagement.Loadingtopics", @@ -5331,7 +5331,10 @@ "descriptionKey": "Abp.Localization.DefaultLanguage.Description", "defaultValue": "en", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -5365,7 +5368,10 @@ "descriptionKey": "Abp.Localization.Timezone.Description", "defaultValue": "UTC", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -5521,7 +5527,11 @@ "descriptionKey": "App.SiteManagement.Theme.Style.Description", "defaultValue": "dx.light.compact", "isVisibleToClients": true, - "providers": ["U", "G", "D"], + "providers": [ + "U", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -5569,7 +5579,10 @@ "descriptionKey": "App.SiteManagement.General.NewMemberNotificationEmails.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -5585,7 +5598,10 @@ "descriptionKey": "App.SiteManagement.General.TimedLoginEmails.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -5601,7 +5617,11 @@ "descriptionKey": "App.Sender.Sms.PostaGuvercini.Url.Description", "defaultValue": "https://www.postaguvercini.com/api_http", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5617,7 +5637,11 @@ "descriptionKey": "App.Sender.Sms.PostaGuvercini.Username.Description", "defaultValue": "2AIlj4QlCrvlbDDBS/712A==", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": true, "mainGroupKey": "App.Sender", @@ -5633,7 +5657,11 @@ "descriptionKey": "App.Sender.Sms.PostaGuvercini.Password.Description", "defaultValue": "oTuwyZM9sxfJI+jDH5wJAw==", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": true, "mainGroupKey": "App.Sender", @@ -5649,7 +5677,11 @@ "descriptionKey": "App.Sender.WhatsApp.Url.Description", "defaultValue": "https://graph.facebook.com/v21.0", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5665,7 +5697,11 @@ "descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description", "defaultValue": "442035112335974", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5681,7 +5717,11 @@ "descriptionKey": "App.Sender.WhatsApp.Token.Description", "defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5697,7 +5737,11 @@ "descriptionKey": "App.Sender.WhatsApp.TemplateName.Description", "defaultValue": "kurs_platform_notification", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5713,7 +5757,10 @@ "descriptionKey": "App.Sender.Rocket.Url.Description", "defaultValue": "https://chat.sozsoft.com/api/v1", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5729,7 +5776,10 @@ "descriptionKey": "App.Sender.Rocket.UserId.Description", "defaultValue": "LfpzPjzag4QJXm84N", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5745,7 +5795,10 @@ "descriptionKey": "App.Sender.Rocket.Token.Description", "defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -5761,7 +5814,11 @@ "descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description", "defaultValue": "Kurs", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5777,7 +5834,11 @@ "descriptionKey": "Abp.Mailing.DefaultFromAddress.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5793,7 +5854,11 @@ "descriptionKey": "Abp.Mailing.Smtp.UserName.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5809,7 +5874,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Password.Description", "defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": true, "mainGroupKey": "Abp.Mailing", @@ -5825,7 +5894,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Host.Description", "defaultValue": "127.0.0.1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5841,7 +5914,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Port.Description", "defaultValue": "25", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5857,7 +5934,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Domain.Description", "defaultValue": "sozsoft.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5873,7 +5954,11 @@ "descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5889,7 +5974,11 @@ "descriptionKey": "Abp.Mailing.AWS.Profile.Description", "defaultValue": "mail-sdk-user", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5905,7 +5994,11 @@ "descriptionKey": "Abp.Mailing.AWS.Region.Description", "defaultValue": "eu-central-1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5921,7 +6014,11 @@ "descriptionKey": "Abp.Mailing.AWS.AccessKey.Description", "defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5937,7 +6034,11 @@ "descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description", "defaultValue": "AKIATULUYBLX4IY3S2P1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -5953,7 +6054,10 @@ "descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -5969,7 +6073,10 @@ "descriptionKey": "Abp.Account.EnableLocalLogin.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -5985,7 +6092,11 @@ "descriptionKey": "Abp.Account.TwoFactor.Enabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -6001,7 +6112,10 @@ "descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description", "defaultValue": "3", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -6017,7 +6131,10 @@ "descriptionKey": "Abp.Account.Captcha.EndPoint.Description", "defaultValue": "https://challenges.cloudflare.com/turnstile/v0/siteverify", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -6033,7 +6150,10 @@ "descriptionKey": "Abp.Account.Captcha.SiteKey.Description", "defaultValue": "0x4AAAAAAAGadwQME-GSYuJU", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -6049,7 +6169,10 @@ "descriptionKey": "Abp.Account.Captcha.SecretKey.Description", "defaultValue": "0x4AAAAAAAGad_f_WP47IcNBs9FTu5DhNX8", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -6065,7 +6188,11 @@ "descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6081,7 +6208,11 @@ "descriptionKey": "Abp.Identity.Profile.General.BlacklistedEmailProviders.Description", "defaultValue": "gmail.com\r\nyahoo.com\r\nhotmail.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6097,7 +6228,11 @@ "descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6113,7 +6248,11 @@ "descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description", "defaultValue": "0", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6129,7 +6268,11 @@ "descriptionKey": "Abp.Identity.Password.RequiredLength.Description", "defaultValue": "6", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6145,7 +6288,11 @@ "descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description", "defaultValue": "1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6161,7 +6308,11 @@ "descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6177,7 +6328,11 @@ "descriptionKey": "Abp.Identity.Password.RequireLowercase.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6193,7 +6348,11 @@ "descriptionKey": "Abp.Identity.Password.RequireUppercase.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6209,7 +6368,11 @@ "descriptionKey": "Abp.Identity.Password.RequireDigit.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6225,7 +6388,11 @@ "descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6241,7 +6408,11 @@ "descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description", "defaultValue": "300", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6257,7 +6428,11 @@ "descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description", "defaultValue": "5", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6273,7 +6448,10 @@ "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6289,7 +6467,10 @@ "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description", "defaultValue": "False", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6305,7 +6486,10 @@ "descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6321,7 +6505,10 @@ "descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -6456,7 +6643,7 @@ "Code": "App.Home", "DisplayName": "App.Home", "Order": 200, - "Url": "/", + "Url": "/home", "Icon": "FcHome", "RequiredPermissionName": null, "IsDisabled": false @@ -6476,7 +6663,7 @@ "Code": "AbpTenantManagement.Tenants", "DisplayName": "AbpTenantManagement.Tenants", "Order": 1, - "Url": "/list/list-tenant", + "Url": "/admin/list/list-tenant", "Icon": "FcDepartment", "RequiredPermissionName": "AbpTenantManagement.Tenants", "IsDisabled": false @@ -6486,7 +6673,7 @@ "Code": "App.Branches", "DisplayName": "App.Branches", "Order": 2, - "Url": "/list/list-branch", + "Url": "/admin/list/list-branch", "Icon": "FcShop", "RequiredPermissionName": "App.Branches", "IsDisabled": false @@ -6506,7 +6693,7 @@ "Code": "App.Settings.SettingDefinitions", "DisplayName": "App.Settings.SettingDefinitions", "Order": 1, - "Url": "/list/list-settingdefinition", + "Url": "/admin/list/list-settingdefinition", "Icon": "FcSupport", "RequiredPermissionName": "App.Settings.SettingDefinitions", "IsDisabled": false @@ -6516,7 +6703,7 @@ "Code": "App.Settings.GlobalSearch", "DisplayName": "App.Settings.GlobalSearch", "Order": 2, - "Url": "/list/list-globalsearch", + "Url": "/admin/list/list-globalsearch", "Icon": "FcSearch", "RequiredPermissionName": "App.Settings.GlobalSearch", "IsDisabled": false @@ -6536,7 +6723,7 @@ "Code": "App.Languages.Language", "DisplayName": "App.Languages.Language", "Order": 1, - "Url": "/list/list-language", + "Url": "/admin/list/list-language", "Icon": "FcGraduationCap", "RequiredPermissionName": "App.Languages.Language", "IsDisabled": false @@ -6546,7 +6733,7 @@ "Code": "App.Languages.LanguageText", "DisplayName": "App.Languages.LanguageText", "Order": 2, - "Url": "/list/list-languagetext", + "Url": "/admin/list/list-languagetext", "Icon": "FcMindMap", "RequiredPermissionName": "App.Languages.LanguageText", "IsDisabled": false @@ -6566,7 +6753,7 @@ "Code": "App.Menus.Menu", "DisplayName": "App.Menus.Menu", "Order": 1, - "Url": "/list/list-menu", + "Url": "/admin/list/list-menu", "Icon": "FcMenu", "RequiredPermissionName": "App.Menus.Menu", "IsDisabled": false @@ -6576,7 +6763,7 @@ "Code": "App.Menus.Manager", "DisplayName": "App.Menus.Manager", "Order": 2, - "Url": "/menumanager", + "Url": "/saas/menuManager", "Icon": "FaRegListAlt", "RequiredPermissionName": "App.Menus.Manager", "IsDisabled": false @@ -6596,7 +6783,7 @@ "Code": "App.Listforms.DataSource", "DisplayName": "App.Listforms.DataSource", "Order": 1, - "Url": "/list/list-datasource", + "Url": "/admin/list/list-datasource", "Icon": "FcAcceptDatabase", "RequiredPermissionName": "App.Listforms.DataSource", "IsDisabled": false @@ -6606,7 +6793,7 @@ "Code": "App.Listforms.Wizard", "DisplayName": "App.Listforms.Wizard", "Order": 2, - "Url": "/admin/listform/wizard", + "Url": "/saas/listform/wizard", "Icon": "FcFlashAuto", "RequiredPermissionName": "App.Listforms.Wizard", "IsDisabled": false @@ -6616,7 +6803,7 @@ "Code": "App.Listforms.Listform", "DisplayName": "App.Listforms.Listform", "Order": 3, - "Url": "/list/list-listform", + "Url": "/admin/list/list-listform", "Icon": "FcDataSheet", "RequiredPermissionName": "App.Listforms.Listform", "IsDisabled": false @@ -6626,7 +6813,7 @@ "Code": "App.Listforms.Chart", "DisplayName": "App.Listforms.Chart", "Order": 4, - "Url": "/list/list-chart", + "Url": "/admin/list/list-chart", "Icon": "FcTodoList", "RequiredPermissionName": "App.Listforms.Chart", "IsDisabled": false @@ -6646,7 +6833,7 @@ "Code": "App.Notifications.NotificationRules", "DisplayName": "App.Notifications.NotificationRules", "Order": 1, - "Url": "/list/list-notificationrule", + "Url": "/admin/list/list-notificationrule", "Icon": "FcLibrary", "RequiredPermissionName": "App.Notifications.NotificationRules", "IsDisabled": false @@ -6656,7 +6843,7 @@ "Code": "App.Notifications.Notification", "DisplayName": "App.Notifications.Notification", "Order": 2, - "Url": "/list/list-notification", + "Url": "/admin/list/list-notification", "Icon": "FcBrokenLink", "RequiredPermissionName": "App.Notifications.Notification", "IsDisabled": false @@ -6666,7 +6853,7 @@ "Code": "App.BackgroundWorkers", "DisplayName": "App.BackgroundWorkers", "Order": 8, - "Url": "/list/list-backgroundworker", + "Url": "/admin/list/list-backgroundworker", "Icon": "FcScatterPlot", "RequiredPermissionName": "App.BackgroundWorkers", "IsDisabled": false @@ -6676,7 +6863,7 @@ "Code": "App.PublicApis", "DisplayName": "App.PublicApis", "Order": 9, - "Url": "/list/list-publicapi", + "Url": "/admin/list/list-publicapi", "Icon": "FcMindMap", "RequiredPermissionName": "App.PublicApis", "IsDisabled": false @@ -6696,7 +6883,7 @@ "Code": "App.BlogManagement.Category", "DisplayName": "App.BlogManagement.Category", "Order": 1, - "Url": "/list/list-blogcategory", + "Url": "/admin/list/list-blogcategory", "Icon": "FaCertificate", "RequiredPermissionName": "App.BlogManagement.Category", "IsDisabled": false @@ -6706,7 +6893,7 @@ "Code": "App.BlogManagement.Posts", "DisplayName": "App.BlogManagement.Posts", "Order": 2, - "Url": "/list/list-blogposts", + "Url": "/admin/list/list-blogposts", "Icon": "FaWeixin", "RequiredPermissionName": "App.BlogManagement.Posts", "IsDisabled": false @@ -6716,7 +6903,7 @@ "Code": "App.ForumManagement", "DisplayName": "App.ForumManagement", "Order": 11, - "Url": "/admin/forummanagement", + "Url": "/admin/forumManagement", "Icon": "FcReading", "RequiredPermissionName": "App.ForumManagement", "IsDisabled": false @@ -6736,7 +6923,7 @@ "Code": "App.Setting", "DisplayName": "App.Setting", "Order": 1, - "Url": "/settings", + "Url": "/admin/settings", "Icon": "FcSettings", "RequiredPermissionName": "App.Setting", "IsDisabled": false @@ -6756,7 +6943,7 @@ "Code": "Abp.Identity.PermissionGroups", "DisplayName": "Abp.Identity.PermissionGroups", "Order": 1, - "Url": "/list/list-permissiongroup", + "Url": "/admin/list/list-permissiongroup", "Icon": "FcEngineering", "RequiredPermissionName": "Abp.Identity.PermissionGroups", "IsDisabled": false @@ -6766,7 +6953,7 @@ "Code": "Abp.Identity.Permissions", "DisplayName": "Abp.Identity.Permissions", "Order": 2, - "Url": "/list/list-permission", + "Url": "/admin/list/list-permission", "Icon": "FcSupport", "RequiredPermissionName": "Abp.Identity.Permissions", "IsDisabled": false @@ -6776,7 +6963,7 @@ "Code": "AbpIdentity.Roles", "DisplayName": "AbpIdentity.Roles", "Order": 3, - "Url": "/list/list-role", + "Url": "/admin/list/list-role", "Icon": "FcFlowChart", "RequiredPermissionName": "AbpIdentity.Roles", "IsDisabled": false @@ -6786,7 +6973,7 @@ "Code": "AbpIdentity.Users", "DisplayName": "AbpIdentity.Users", "Order": 4, - "Url": "/list/list-user", + "Url": "/admin/list/list-user", "Icon": "FcBusinessman", "RequiredPermissionName": "AbpIdentity.Users", "IsDisabled": false @@ -6806,7 +6993,7 @@ "Code": "App.ClaimType", "DisplayName": "App.ClaimType", "Order": 6, - "Url": "/list/list-claimtype", + "Url": "/admin/list/list-claimtype", "Icon": "FcOrganization", "RequiredPermissionName": "App.ClaimType", "IsDisabled": false @@ -6816,7 +7003,7 @@ "Code": "App.IpRestrictions", "DisplayName": "App.IpRestrictions", "Order": 7, - "Url": "/list/list-iprestriction", + "Url": "/admin/list/list-iprestriction", "Icon": "FcNfcSign", "RequiredPermissionName": "App.IpRestrictions", "IsDisabled": false @@ -6826,7 +7013,7 @@ "Code": "App.AuditLogs", "DisplayName": "App.AuditLogs", "Order": 3, - "Url": "/list/list-auditlog", + "Url": "/admin/list/list-auditlog", "Icon": "FcMultipleInputs", "RequiredPermissionName": "App.AuditLogs", "IsDisabled": false @@ -6856,7 +7043,7 @@ "Code": "App.Definitions.Sector", "DisplayName": "App.Definitions.Sector", "Order": 1, - "Url": "/list/list-sector", + "Url": "/admin/list/list-sector", "Icon": "FcBiomass", "RequiredPermissionName": "App.Definitions.Sector", "IsDisabled": false @@ -6866,7 +7053,7 @@ "Code": "App.Definitions.ContactTag", "DisplayName": "App.Definitions.ContactTag", "Order": 2, - "Url": "/list/list-contactTag", + "Url": "/admin/list/list-contactTag", "Icon": "FcButtingIn", "RequiredPermissionName": "App.Definitions.ContactTag", "IsDisabled": false @@ -6876,7 +7063,7 @@ "Code": "App.Definitions.ContactTitle", "DisplayName": "App.Definitions.ContactTitle", "Order": 3, - "Url": "/list/list-contactTitle", + "Url": "/admin/list/list-contactTitle", "Icon": "FcNeutralDecision", "RequiredPermissionName": "App.Definitions.ContactTitle", "IsDisabled": false @@ -6886,7 +7073,7 @@ "Code": "App.Definitions.Currency", "DisplayName": "App.Definitions.Currency", "Order": 4, - "Url": "/list/list-currency", + "Url": "/admin/list/list-currency", "Icon": "FcCurrencyExchange", "RequiredPermissionName": "App.Definitions.Currency", "IsDisabled": false @@ -6896,7 +7083,7 @@ "Code": "App.Definitions.CountryGroup", "DisplayName": "App.Definitions.CountryGroup", "Order": 5, - "Url": "/list/list-countryGroup", + "Url": "/admin/list/list-countryGroup", "Icon": "FaFlag", "RequiredPermissionName": "App.Definitions.CountryGroup", "IsDisabled": false @@ -6906,7 +7093,7 @@ "Code": "App.Definitions.Country", "DisplayName": "App.Definitions.Country", "Order": 6, - "Url": "/list/list-country", + "Url": "/admin/list/list-country", "Icon": "FaFlagCheckered", "RequiredPermissionName": "App.Definitions.Country", "IsDisabled": false @@ -6916,7 +7103,7 @@ "Code": "App.Definitions.State", "DisplayName": "App.Definitions.State", "Order": 7, - "Url": "/list/list-city", + "Url": "/admin/list/list-city", "Icon": "FaFontAwesomeFlag", "RequiredPermissionName": "App.Definitions.State", "IsDisabled": false @@ -6926,7 +7113,7 @@ "Code": "App.Definitions.SkillType", "DisplayName": "App.Definitions.SkillType", "Order": 8, - "Url": "/list/list-skillType", + "Url": "/admin/list/list-skillType", "Icon": "FaHollyBerry", "RequiredPermissionName": "App.Definitions.SkillType", "IsDisabled": false @@ -6936,7 +7123,7 @@ "Code": "App.Definitions.UomCategory", "DisplayName": "App.Definitions.UomCategory", "Order": 9, - "Url": "/list/list-uomCategory", + "Url": "/admin/list/list-uomCategory", "Icon": "FaSynagogue", "RequiredPermissionName": "App.Definitions.UomCategory", "IsDisabled": false @@ -7061,7 +7248,6 @@ "IsEnabled": true, "MultiTenancySide": 3 }, - { "GroupName": "AbpIdentity", "Name": "App.ClaimType", @@ -8269,7 +8455,7 @@ "DisplayName": "Publish", "IsEnabled": true, "MultiTenancySide": 2 - }, + }, { "GroupName": "App.ForumManagement", "Name": "App.ForumManagement.Create", @@ -21240,5 +21426,217 @@ "Id": "1a79a36e-e062-4335-9ddf-0557c60f3ea9", "BotName": "Chat Bot" } + ], + "Routes": [ + { + "key": "home", + "path": "/home", + "componentPath": "@/views/Home", + "routeType": "public", + "authority": [] + }, + { + "key": "login", + "path": "/login", + "componentPath": "@/views/auth/Login", + "routeType": "public", + "authority": [] + }, + { + "key": "register", + "path": "/register", + "componentPath": "@/views/auth/Register", + "routeType": "public", + "authority": [] + }, + { + "key": "forgotPassword", + "path": "/forgot-password", + "componentPath": "@/views/auth/ForgotPassword", + "routeType": "public", + "authority": [] + }, + { + "key": "resetPassword", + "path": "/reset-password", + "componentPath": "@/views/auth/ResetPassword", + "routeType": "public", + "authority": [] + }, + { + "key": "sendConfirmationCode", + "path": "/confirm", + "componentPath": "@/views/auth/SendConfirmationCode", + "routeType": "public", + "authority": [] + }, + { + "key": "sendExtendLogin", + "path": "/extend-login", + "componentPath": "@/views/auth/ExtendLogin", + "routeType": "public", + "authority": [] + }, + { + "key": "verifyConfirmationCode", + "path": "/confirm/:userId/:token", + "componentPath": "@/views/auth/VerifyConfirmationCode", + "routeType": "public", + "authority": [] + }, + { + "key": "access-denied", + "path": "/access-denied", + "componentPath": "@/views/AccessDenied", + "routeType": "public", + "authority": [] + }, + { + "key": "saas.menuManager", + "path": "/saas/menuManager", + "componentPath": "@/views/menu/MenuManager", + "routeType": "protected", + "authority": [] + }, + { + "key": "saas.listFormManagement.wizard", + "path": "/saas/listform/wizard", + "componentPath": "@/views/admin/listForm/Wizard", + "routeType": "protected", + "authority": [] + }, + { + "key": "saas.listFormManagement.edit", + "path": "/saas/listform/edit/:listFormCode", + "componentPath": "@/views/admin/listForm/edit/FormEdit", + "routeType": "protected", + "authority": [] + }, + { + "key": "saas.chartManagement.edit", + "path": "/saas/chart/edit/:chartCode", + "componentPath": "@/views/admin/chart/ChartEdit", + "routeType": "protected", + "authority": [] + }, + { + "key": "saas.forumManagement", + "path": "/admin/forumManagement", + "componentPath": "@/views/forum/Management", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.ai", + "path": "/admin/ai", + "componentPath": "@/views/ai/Assistant", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.profile.general", + "path": "/admin/settings/general", + "componentPath": "@/views/auth/Settings", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.profile.password", + "path": "/admin/settings/password", + "componentPath": "@/views/auth/Settings", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.profile.notificationSettings", + "path": "/admin/settings/notification-settings", + "componentPath": "@/views/auth/Settings", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.activityLog", + "path": "/admin/activityLog", + "componentPath": "@/views/admin/activityLog/ActivityLog", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.changeLog", + "path": "/admin/changeLog", + "componentPath": "@/views/docs/ChangeLog", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.settings", + "path": "/admin/settings", + "componentPath": "@/views/settings/Settings", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.identity.user.detail", + "path": "/admin/users/detail/:userId", + "componentPath": "@/views/admin/user-management/Details", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.identity.ous", + "path": "/admin/ous", + "componentPath": "@/views/admin/organization-unit/OrganizationUnits", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.forum", + "path": "/admin/forum", + "componentPath": "@/views/forum/Forum", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.list", + "path": "/admin/list/:listFormCode", + "componentPath": "@/views/list/List", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.formNew", + "path": "/admin/form/:listFormCode", + "componentPath": "@/views/form/FormNew", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.formView", + "path": "/admin/form/:listFormCode/:id", + "componentPath": "@/views/form/FormView", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.formEdit", + "path": "/admin/form/:listFormCode/:id/edit", + "componentPath": "@/views/form/FormEdit", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.chart", + "path": "/admin/chart/:chartCode", + "componentPath": "@/views/chart/Chart", + "routeType": "protected", + "authority": [] + }, + { + "key": "admin.pivot", + "path": "/admin/pivot/:listFormCode", + "componentPath": "@/views/list/ListPivot", + "routeType": "protected", + "authority": [] + } ] -} +} \ No newline at end of file diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederDto.cs b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederDto.cs index 8ad8fab5..3716ba4e 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederDto.cs +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederDto.cs @@ -37,6 +37,7 @@ public class SeederDto public List BlogPosts { get; set; } public List ForumCategories { get; set; } public List AiBots { get; set; } + public List Routes { get; set; } } public class ChartsSeedDto @@ -244,3 +245,12 @@ public class AiBotSeedDto public Guid Id { get; set; } public string BotName { get; set; } } + +public class RouteSeedDto +{ + public string Key { get; set; } + public string Path { get; set; } + public string ComponentPath { get; set; } + public string RouteType { get; set; } + public string[] Authority { get; set; } +} diff --git a/api/src/Kurs.Platform.Domain/Entities/BlogCategory.cs b/api/src/Kurs.Platform.Domain/Entities/BlogCategory.cs index 86a48c5a..9ee9ddbf 100644 --- a/api/src/Kurs.Platform.Domain/Entities/BlogCategory.cs +++ b/api/src/Kurs.Platform.Domain/Entities/BlogCategory.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; namespace Kurs.Platform.Entities; diff --git a/api/src/Kurs.Platform.Domain/Entities/BlogPost.cs b/api/src/Kurs.Platform.Domain/Entities/BlogPost.cs index 2de7133c..ab5c5a26 100644 --- a/api/src/Kurs.Platform.Domain/Entities/BlogPost.cs +++ b/api/src/Kurs.Platform.Domain/Entities/BlogPost.cs @@ -1,6 +1,5 @@ using System; using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; namespace Kurs.Platform.Entities; diff --git a/api/src/Kurs.Platform.Domain/Entities/Route.cs b/api/src/Kurs.Platform.Domain/Entities/Route.cs new file mode 100644 index 00000000..441d75e2 --- /dev/null +++ b/api/src/Kurs.Platform.Domain/Entities/Route.cs @@ -0,0 +1,22 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Kurs.Platform.Entities; + +public class Route : FullAuditedAggregateRoot +{ + public string Key { get; set; } + public string Path { get; set; } + public string ComponentPath { get; set; } + public string RouteType { get; set; } + public string[] Authority { get; set; } + + public Route(string key, string path, string componentPath, string routeType, string[] authority) + { + Key = key; + Path = path; + ComponentPath = componentPath; + RouteType = routeType; + Authority = authority; + } +} diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs index caa7f93d..18c44c1b 100644 --- a/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs +++ b/api/src/Kurs.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs @@ -19,6 +19,9 @@ using Volo.Abp.TenantManagement.EntityFrameworkCore; using Kurs.Notifications.EntityFrameworkCore; using static Kurs.Settings.SettingsConsts; using Kurs.Platform.Forum; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using System; +using System.Linq; namespace Kurs.Platform.EntityFrameworkCore; @@ -59,6 +62,7 @@ public class PlatformDbContext : public DbSet ContactTitles { get; set; } public DbSet BlogPosts { get; set; } public DbSet BlogCategories { get; set; } + public DbSet Routes { get; set; } // Forum Entities public DbSet ForumCategories { get; set; } @@ -402,7 +406,7 @@ public class PlatformDbContext : // Blog Entity Configurations builder.Entity(b => { - b.ToTable(PlatformConsts.DbTablePrefix + "BlogCategories", PlatformConsts.DbSchema); + b.ToTable(PlatformConsts.DbTablePrefix + nameof(BlogCategory), PlatformConsts.DbSchema); b.ConfigureByConvention(); b.Property(x => x.Name).IsRequired().HasMaxLength(128); @@ -414,7 +418,7 @@ public class PlatformDbContext : builder.Entity(b => { - b.ToTable(PlatformConsts.DbTablePrefix + "BlogPosts", PlatformConsts.DbSchema); + b.ToTable(PlatformConsts.DbTablePrefix + nameof(BlogPost), PlatformConsts.DbSchema); b.ConfigureByConvention(); b.Property(x => x.Title).IsRequired().HasMaxLength(256); @@ -438,7 +442,7 @@ public class PlatformDbContext : // ForumCategory builder.Entity(b => { - b.ToTable(PlatformConsts.DbTablePrefix + "ForumCategories", PlatformConsts.DbSchema); + b.ToTable(PlatformConsts.DbTablePrefix + nameof(ForumCategory), PlatformConsts.DbSchema); b.ConfigureByConvention(); b.Property(x => x.Name).IsRequired().HasMaxLength(128); @@ -455,7 +459,7 @@ public class PlatformDbContext : // ForumTopic builder.Entity(b => { - b.ToTable(PlatformConsts.DbTablePrefix + "ForumTopics", PlatformConsts.DbSchema); + b.ToTable(PlatformConsts.DbTablePrefix + nameof(ForumTopic), PlatformConsts.DbSchema); b.ConfigureByConvention(); b.Property(x => x.Title).IsRequired().HasMaxLength(256); @@ -474,7 +478,7 @@ public class PlatformDbContext : // ForumPost builder.Entity(b => { - b.ToTable(PlatformConsts.DbTablePrefix + "ForumPosts", PlatformConsts.DbSchema); + b.ToTable(PlatformConsts.DbTablePrefix + nameof(ForumPost), PlatformConsts.DbSchema); b.ConfigureByConvention(); b.Property(x => x.Content).IsRequired(); @@ -492,5 +496,24 @@ public class PlatformDbContext : .OnDelete(DeleteBehavior.Restrict); }); + builder.Entity(b => + { + b.ToTable(PlatformConsts.DbTablePrefix + nameof(Route), PlatformConsts.DbSchema); + b.ConfigureByConvention(); + + b.Property(x => x.Key).IsRequired().HasMaxLength(128); + b.Property(x => x.Path).IsRequired().HasMaxLength(256); + b.Property(x => x.ComponentPath).IsRequired().HasMaxLength(256); + b.Property(x => x.Authority).HasConversion( + v => string.Join(",", v), + v => v.Split(',', StringSplitOptions.RemoveEmptyEntries) + ).Metadata.SetValueComparer( + new ValueComparer( + (c1, c2) => c1.SequenceEqual(c2), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => c.ToArray() + ) + ); + }); } } diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.Designer.cs b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.Designer.cs new file mode 100644 index 00000000..b0927526 --- /dev/null +++ b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.Designer.cs @@ -0,0 +1,5193 @@ +// +using System; +using Kurs.Platform.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Kurs.Platform.Migrations +{ + [DbContext(typeof(PlatformDbContext))] + [Migration("20250628190318_AddRoutes")] + partial class AddRoutes + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ContactTag", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Category") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("PContactTag", (string)null); + }); + + modelBuilder.Entity("ContactTitle", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Abbreviation") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("PContactTitle", (string)null); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("TwoLetterISOLanguageName") + .HasColumnType("nvarchar(max)"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.HasKey("Id"); + + b.ToTable("PLanguage", (string)null); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.LanguageKey", b => + { + b.Property("ResourceName") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.HasKey("ResourceName", "Key"); + + b.ToTable("PLanguageKey", (string)null); + }); + + modelBuilder.Entity("Kurs.Languages.Entities.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ResourceName") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + 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("uniqueidentifier"); + + b.Property("Attachment") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("AttachmentParameter") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("AwsMessageId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("From") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("MailParameter") + .HasMaxLength(8000) + .HasColumnType("nvarchar(max)"); + + b.Property("RelatedRecordId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("SendStatus") + .HasColumnType("bit"); + + b.Property("SendTime") + .HasColumnType("datetime2"); + + b.Property("Table") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("TableParameter") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("TemplateId") + .HasColumnType("uniqueidentifier"); + + b.Property("To") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("Id"); + + b.ToTable("PBackgroundWorker_MailQueue", (string)null); + }); + + modelBuilder.Entity("Kurs.MailQueue.Domain.Entities.BackgroundWorker_MailQueueEvents", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AwsMessageId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Event") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("EventDate") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("MailAddress") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ResponseDescription") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PBackgroundWorker_MailQueueEvents", (string)null); + }); + + modelBuilder.Entity("Kurs.MailQueue.Domain.Entities.BackgroundWorker_MailQueueTableFormat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ColumnName") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Css") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("DataFormat") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("DataType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("FooterCss") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("HeaderCss") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("IsHidden") + .HasColumnType("bit"); + + b.Property("IsProtected") + .HasColumnType("bit"); + + b.Property("Order") + .HasColumnType("smallint"); + + b.Property("SubTotal") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TableName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Width") + .HasColumnType("int"); + + 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("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Identifier") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsRead") + .HasColumnType("bit"); + + b.Property("IsSent") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Message") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("NotificationChannel") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("NotificationRuleId") + .HasColumnType("uniqueidentifier"); + + b.Property("NotificationType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ReadTime") + .HasColumnType("datetime2"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.ToTable("PNotification", (string)null); + }); + + modelBuilder.Entity("Kurs.Notifications.Entities.NotificationRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Channel") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsCustomized") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsFixed") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("NotificationType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("RecipientId") + .HasColumnType("nvarchar(max)"); + + b.Property("RecipientType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PNotificationRule", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.AiBot", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("BotName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PAiBot", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BackgroundWorker", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AfterSp") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("BeforeSp") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("Cron") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("DataSourceCode") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Options") + .HasColumnType("nvarchar(max)"); + + b.Property("WorkerType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("PBackgroundWorker", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Bank", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AddressLine1") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("AddressLine2") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("City") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Country") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("District") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Email") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IdentifierCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Phone") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PostalCode") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.HasKey("Id"); + + b.ToTable("Banks"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BankAccount", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AccountNumber") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("AccountOwner") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("BankId") + .HasColumnType("uniqueidentifier"); + + b.Property("CanTransferMoney") + .HasColumnType("bit"); + + b.Property("Company") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CurrencyId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.HasIndex("BankId"); + + b.HasIndex("CurrencyId"); + + b.ToTable("BankAccounts"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BlogCategory", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayOrder") + .HasColumnType("int"); + + b.Property("Icon") + .HasColumnType("nvarchar(max)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PostCount") + .HasColumnType("int"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Slug"); + + b.ToTable("PBlogCategory", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BlogPost", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorId") + .HasColumnType("uniqueidentifier"); + + b.Property("CategoryId") + .HasColumnType("uniqueidentifier"); + + b.Property("CommentCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContentEn") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ContentTr") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CoverImage") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsPublished") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LikeCount") + .HasColumnType("int"); + + b.Property("PublishedAt") + .HasColumnType("datetime2"); + + b.Property("ReadTime") + .HasColumnType("nvarchar(max)"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Summary") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ViewCount") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("IsPublished"); + + b.HasIndex("PublishedAt"); + + b.HasIndex("Slug"); + + b.ToTable("PBlogPost", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Branch", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Address") + .HasColumnType("nvarchar(max)"); + + b.Property("Address2") + .HasColumnType("nvarchar(max)"); + + b.Property("City") + .HasColumnType("nvarchar(max)"); + + b.Property("Code") + .HasColumnType("nvarchar(max)"); + + b.Property("Country") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("District") + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("Fax") + .HasColumnType("bigint"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Mobile") + .HasColumnType("bigint"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("PostalCode") + .HasColumnType("nvarchar(max)"); + + b.Property("TaxOffice") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("VknTckn") + .HasColumnType("bigint"); + + b.Property("Website") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PBranch", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BranchUsers", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("BranchId") + .HasColumnType("uniqueidentifier"); + + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "BranchId"); + + b.ToTable("PBranchUsers", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Chart", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AdaptiveLayoutJson") + .HasColumnType("nvarchar(max)"); + + b.Property("AnimationJson") + .HasColumnType("nvarchar(max)"); + + b.Property("AnnotationsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("ArgumentAxisJson") + .HasColumnType("nvarchar(max)"); + + b.Property("ChartCode") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CommonAnnotationsSettingsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CommonAxisSettingsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CommonJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CommonPaneSettingsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CommonSeriesSettingsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CrosshairJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CultureName") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(max)") + .HasDefaultValue("en"); + + b.Property("DataSourceCode") + .HasColumnType("nvarchar(max)"); + + b.Property("DataSourceJson") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExportJson") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBranch") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsOrganizationUnit") + .HasColumnType("bit"); + + b.Property("IsTenant") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LegendJson") + .HasColumnType("nvarchar(max)"); + + b.Property("MarginJson") + .HasColumnType("nvarchar(max)"); + + b.Property("PanesJson") + .HasColumnType("nvarchar(max)"); + + b.Property("PermissionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(max)"); + + b.Property("ScrollBarJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SeriesJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SizeJson") + .HasColumnType("nvarchar(max)"); + + b.Property("TitleJson") + .HasColumnType("nvarchar(max)"); + + b.Property("TooltipJson") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(max)"); + + b.Property("ValueAxisJson") + .HasColumnType("nvarchar(max)"); + + b.Property("ZoomAndPanJson") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PChart", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.City", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("CountryCode") + .HasMaxLength(8) + .HasColumnType("nvarchar(8)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CountryCode", "Code") + .IsUnique() + .HasFilter("[CountryCode] IS NOT NULL AND [Code] IS NOT NULL"); + + b.ToTable("PCity", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Country", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("nvarchar(8)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CurrencyCode") + .HasMaxLength(8) + .HasColumnType("nvarchar(8)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("GroupName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PhoneCode") + .HasMaxLength(16) + .HasColumnType("int"); + + b.Property("StateRequired") + .HasColumnType("bit"); + + b.Property("TaxLabel") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ZipRequired") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("GroupName"); + + b.ToTable("PCountry", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.CountryGroup", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("PCountryGroup", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Currency", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("nvarchar(8)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastUpdated") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Rate") + .HasColumnType("decimal(18,6)"); + + b.Property("Symbol") + .HasMaxLength(8) + .HasColumnType("nvarchar(8)"); + + b.HasKey("Id"); + + b.ToTable("PCurrency", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.DataSource", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ConnectionString") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DataSourceType") + .HasColumnType("int"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.ToTable("PDataSource", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.GlobalSearch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Group") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("System") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Term") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.Property("Weight") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PGlobalSearch", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.IpRestriction", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IP") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ResourceId") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("PIpRestriction", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListForm", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ColumnOptionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CommandColumnJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasColumnType("nvarchar(max)"); + + b.Property("CustomJsSourcesJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CustomStyleSourcesJson") + .HasColumnType("nvarchar(max)"); + + b.Property("DataSourceCode") + .HasColumnType("nvarchar(max)"); + + b.Property("DefaultFilter") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleteCommand") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleteFieldsDefaultValueJson") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleteServiceAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EditingFormJson") + .HasColumnType("nvarchar(max)"); + + b.Property("EditingOptionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("FilterPanelJson") + .HasColumnType("nvarchar(max)"); + + b.Property("FilterRowJson") + .HasColumnType("nvarchar(max)"); + + b.Property("FormFieldsDefaultValueJson") + .HasColumnType("nvarchar(max)"); + + b.Property("GroupPanelJson") + .HasColumnType("nvarchar(max)"); + + b.Property("HeaderFilterJson") + .HasColumnType("nvarchar(max)"); + + b.Property("Height") + .HasColumnType("int"); + + b.Property("InsertCommand") + .HasColumnType("nvarchar(max)"); + + b.Property("InsertFieldsDefaultValueJson") + .HasColumnType("nvarchar(max)"); + + b.Property("InsertServiceAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBranch") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsOrganizationUnit") + .HasColumnType("bit"); + + b.Property("IsSubForm") + .HasColumnType("bit"); + + b.Property("IsTenant") + .HasColumnType("bit"); + + b.Property("KeyFieldDbSourceType") + .HasColumnType("int"); + + b.Property("KeyFieldName") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ListFormCode") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("ListFormType") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("PageSize") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(10); + + b.Property("PagerOptionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("PermissionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SearchPanelJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SelectCommand") + .HasColumnType("nvarchar(max)"); + + b.Property("SelectCommandType") + .HasColumnType("int"); + + b.Property("SelectFieldsDefaultValueJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SelectionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SortMode") + .HasColumnType("nvarchar(max)"); + + b.Property("StateStoringJson") + .HasColumnType("nvarchar(max)"); + + b.Property("SubFormsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("TableName") + .HasColumnType("nvarchar(max)"); + + b.Property("Title") + .HasColumnType("nvarchar(max)"); + + b.Property("UpdateCommand") + .HasColumnType("nvarchar(max)"); + + b.Property("UpdateFieldsDefaultValueJson") + .HasColumnType("nvarchar(max)"); + + b.Property("UpdateServiceAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("Width") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("PListForm", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListFormCustomization", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CustomizationData") + .HasColumnType("nvarchar(max)"); + + b.Property("CustomizationType") + .HasColumnType("int"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("FilterName") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ListFormCode") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ListFormCode"); + + b.ToTable("PListFormCustomization", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.ListFormField", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Alignment") + .HasColumnType("nvarchar(max)"); + + b.Property("AllowSearch") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("BandName") + .HasColumnType("nvarchar(max)"); + + b.Property("CaptionName") + .HasColumnType("nvarchar(max)"); + + b.Property("ColumnCssClass") + .HasColumnType("nvarchar(max)"); + + b.Property("ColumnCssValue") + .HasColumnType("nvarchar(max)"); + + b.Property("ColumnCustomizationJson") + .HasColumnType("nvarchar(max)"); + + b.Property("ColumnFilterJson") + .HasColumnType("nvarchar(max)"); + + b.Property("ColumnHeaderJson") + .HasColumnType("nvarchar(max)"); + + b.Property("ColumnStylingJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EditingJson") + .HasColumnType("nvarchar(max)"); + + b.Property("EditorOptions") + .HasColumnType("nvarchar(max)"); + + b.Property("FieldName") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Format") + .HasColumnType("nvarchar(max)"); + + b.Property("GroupSummaryJson") + .HasColumnType("nvarchar(max)"); + + b.Property("GroupingJson") + .HasColumnType("nvarchar(max)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JoinTableJson") + .HasColumnType("nvarchar(max)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ListFormCode") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("ListOrderNo") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(30); + + b.Property("LookupJson") + .HasColumnType("nvarchar(max)"); + + b.Property("PermissionJson") + .HasColumnType("nvarchar(max)"); + + b.Property("PivotSettingsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(max)"); + + b.Property("SortDirection") + .HasColumnType("nvarchar(max)"); + + b.Property("SortIndex") + .HasColumnType("int"); + + b.Property("SourceDbType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(16); + + b.Property("TotalSummaryJson") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(max)"); + + b.Property("ValidationRuleJson") + .HasColumnType("nvarchar(max)"); + + b.Property("Visible") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("Width") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(100); + + b.HasKey("Id"); + + b.HasIndex("ListFormCode"); + + b.ToTable("PListFormField", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Menu", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CssClass") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CultureName") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ElementId") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Icon") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsDisabled") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ParentCode") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("RequiredPermissionName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RoleId") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Target") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Url") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserId") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.ToTable("PMenu", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.PublicApi", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DataSourceCode") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Method") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParametersJson") + .HasColumnType("nvarchar(max)"); + + b.Property("PermissionsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("Sql") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PPublicApi", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Route", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Authority") + .HasColumnType("nvarchar(max)"); + + b.Property("ComponentPath") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Path") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("RouteType") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PRoute", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Sector", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("FullName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("PSector", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Uom", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CategoryName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Ratio") + .HasPrecision(18, 6) + .HasColumnType("decimal(18,6)"); + + b.Property("Rounding") + .HasPrecision(18, 6) + .HasColumnType("decimal(18,6)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.HasKey("Id"); + + b.HasIndex("CategoryName"); + + b.ToTable("PUom", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.UomCategory", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("PUomCategory", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumCategory", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayOrder") + .HasColumnType("int"); + + b.Property("Icon") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsLocked") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPostDate") + .HasColumnType("datetime2"); + + b.Property("LastPostId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastPostUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastPostUserName") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PostCount") + .HasColumnType("int"); + + b.Property("Slug") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TopicCount") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("DisplayOrder"); + + b.ToTable("PForumCategory", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumPost", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorName") + .HasColumnType("nvarchar(max)"); + + b.Property("Content") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsAcceptedAnswer") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LikeCount") + .HasColumnType("int"); + + b.Property("ParentPostId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TopicId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("ParentPostId"); + + b.HasIndex("TopicId"); + + b.ToTable("PForumPost", (string)null); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumTopic", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorName") + .HasColumnType("nvarchar(max)"); + + b.Property("CategoryId") + .HasColumnType("uniqueidentifier"); + + b.Property("Content") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsLocked") + .HasColumnType("bit"); + + b.Property("IsPinned") + .HasColumnType("bit"); + + b.Property("IsSolved") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPostDate") + .HasColumnType("datetime2"); + + b.Property("LastPostId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastPostUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastPostUserName") + .HasColumnType("nvarchar(max)"); + + b.Property("LikeCount") + .HasColumnType("int"); + + b.Property("ReplyCount") + .HasColumnType("int"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ViewCount") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("IsPinned"); + + b.HasIndex("LastPostDate"); + + b.ToTable("PForumTopic", (string)null); + }); + + modelBuilder.Entity("Kurs.Settings.Entities.SettingDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DataType") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DescriptionKey") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEncrypted") + .HasColumnType("bit"); + + b.Property("IsInherited") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("MainGroupKey") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("NameKey") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("Providers") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RequiredPermissionName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SelectOptions") + .HasColumnType("nvarchar(max)"); + + b.Property("SubGroupKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("PSettingDefinition", (string)null); + }); + + modelBuilder.Entity("Skill", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SkillTypeId") + .HasColumnType("uniqueidentifier"); + + b.Property("TypeName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("SkillTypeId"); + + b.ToTable("PSkill", (string)null); + }); + + modelBuilder.Entity("SkillLevel", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDefault") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Progress") + .HasColumnType("int"); + + b.Property("SkillTypeId") + .HasColumnType("uniqueidentifier"); + + b.Property("TypeName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("SkillTypeId"); + + b.ToTable("PSkillLevel", (string)null); + }); + + modelBuilder.Entity("SkillType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("PSkillType", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + 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("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .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("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + 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("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + 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("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + 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("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("IsVerified") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("LoginEndDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("RocketUsername") + .HasColumnType("nvarchar(max)"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + 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("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .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("uniqueidentifier"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("nvarchar(max)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Settings") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + 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("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + 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("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + 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("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("bit"); + + b.Property("IsInherited") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Address") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Address2") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("City") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Country") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("District") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Fax") + .HasColumnType("bigint"); + + b.Property("InstitutionName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Mobile") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("PostalCode") + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("TaxOffice") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("VknTckn") + .HasColumnType("bigint"); + + b.Property("Website") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + 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("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + 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.BankAccount", b => + { + b.HasOne("Kurs.Platform.Entities.Bank", "Bank") + .WithMany() + .HasForeignKey("BankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kurs.Platform.Entities.Currency", "Currency") + .WithMany() + .HasForeignKey("CurrencyId"); + + b.Navigation("Bank"); + + b.Navigation("Currency"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.BlogPost", b => + { + b.HasOne("Kurs.Platform.Entities.BlogCategory", "Category") + .WithMany("Posts") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.City", b => + { + b.HasOne("Kurs.Platform.Entities.Country", "Country") + .WithMany("Cities") + .HasForeignKey("CountryCode") + .HasPrincipalKey("Code") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Country"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Country", b => + { + b.HasOne("Kurs.Platform.Entities.CountryGroup", null) + .WithMany() + .HasForeignKey("GroupName") + .HasPrincipalKey("Name") + .OnDelete(DeleteBehavior.Restrict); + }); + + 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("Kurs.Platform.Entities.Uom", b => + { + b.HasOne("Kurs.Platform.Entities.UomCategory", "UomCategory") + .WithMany("Units") + .HasForeignKey("CategoryName") + .HasPrincipalKey("Name") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("UomCategory"); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumPost", b => + { + b.HasOne("Kurs.Platform.Forum.ForumPost", "ParentPost") + .WithMany("Replies") + .HasForeignKey("ParentPostId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Kurs.Platform.Forum.ForumTopic", "Topic") + .WithMany("Posts") + .HasForeignKey("TopicId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentPost"); + + b.Navigation("Topic"); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumTopic", b => + { + b.HasOne("Kurs.Platform.Forum.ForumCategory", "Category") + .WithMany("Topics") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("Skill", b => + { + b.HasOne("SkillType", null) + .WithMany("Skills") + .HasForeignKey("SkillTypeId"); + }); + + modelBuilder.Entity("SkillLevel", b => + { + b.HasOne("SkillType", null) + .WithMany("Levels") + .HasForeignKey("SkillTypeId"); + }); + + 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("Kurs.Platform.Entities.BlogCategory", b => + { + b.Navigation("Posts"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.Country", b => + { + b.Navigation("Cities"); + }); + + modelBuilder.Entity("Kurs.Platform.Entities.UomCategory", b => + { + b.Navigation("Units"); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumCategory", b => + { + b.Navigation("Topics"); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumPost", b => + { + b.Navigation("Replies"); + }); + + modelBuilder.Entity("Kurs.Platform.Forum.ForumTopic", b => + { + b.Navigation("Posts"); + }); + + modelBuilder.Entity("SkillType", b => + { + b.Navigation("Levels"); + + b.Navigation("Skills"); + }); + + 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/20250628190318_AddRoutes.cs b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.cs new file mode 100644 index 00000000..1d94d503 --- /dev/null +++ b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/20250628190318_AddRoutes.cs @@ -0,0 +1,383 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Kurs.Platform.Migrations +{ + /// + public partial class AddRoutes : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_PBlogPosts_PBlogCategories_CategoryId", + table: "PBlogPosts"); + + migrationBuilder.DropForeignKey( + name: "FK_PForumPosts_PForumPosts_ParentPostId", + table: "PForumPosts"); + + migrationBuilder.DropForeignKey( + name: "FK_PForumPosts_PForumTopics_TopicId", + table: "PForumPosts"); + + migrationBuilder.DropForeignKey( + name: "FK_PForumTopics_PForumCategories_CategoryId", + table: "PForumTopics"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PForumTopics", + table: "PForumTopics"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PForumPosts", + table: "PForumPosts"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PForumCategories", + table: "PForumCategories"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PBlogPosts", + table: "PBlogPosts"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PBlogCategories", + table: "PBlogCategories"); + + migrationBuilder.RenameTable( + name: "PForumTopics", + newName: "PForumTopic"); + + migrationBuilder.RenameTable( + name: "PForumPosts", + newName: "PForumPost"); + + migrationBuilder.RenameTable( + name: "PForumCategories", + newName: "PForumCategory"); + + migrationBuilder.RenameTable( + name: "PBlogPosts", + newName: "PBlogPost"); + + migrationBuilder.RenameTable( + name: "PBlogCategories", + newName: "PBlogCategory"); + + migrationBuilder.RenameIndex( + name: "IX_PForumTopics_LastPostDate", + table: "PForumTopic", + newName: "IX_PForumTopic_LastPostDate"); + + migrationBuilder.RenameIndex( + name: "IX_PForumTopics_IsPinned", + table: "PForumTopic", + newName: "IX_PForumTopic_IsPinned"); + + migrationBuilder.RenameIndex( + name: "IX_PForumTopics_CategoryId", + table: "PForumTopic", + newName: "IX_PForumTopic_CategoryId"); + + migrationBuilder.RenameIndex( + name: "IX_PForumPosts_TopicId", + table: "PForumPost", + newName: "IX_PForumPost_TopicId"); + + migrationBuilder.RenameIndex( + name: "IX_PForumPosts_ParentPostId", + table: "PForumPost", + newName: "IX_PForumPost_ParentPostId"); + + migrationBuilder.RenameIndex( + name: "IX_PForumCategories_DisplayOrder", + table: "PForumCategory", + newName: "IX_PForumCategory_DisplayOrder"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPosts_Slug", + table: "PBlogPost", + newName: "IX_PBlogPost_Slug"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPosts_PublishedAt", + table: "PBlogPost", + newName: "IX_PBlogPost_PublishedAt"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPosts_IsPublished", + table: "PBlogPost", + newName: "IX_PBlogPost_IsPublished"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPosts_CategoryId", + table: "PBlogPost", + newName: "IX_PBlogPost_CategoryId"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogCategories_Slug", + table: "PBlogCategory", + newName: "IX_PBlogCategory_Slug"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PForumTopic", + table: "PForumTopic", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PForumPost", + table: "PForumPost", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PForumCategory", + table: "PForumCategory", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PBlogPost", + table: "PBlogPost", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PBlogCategory", + table: "PBlogCategory", + column: "Id"); + + migrationBuilder.CreateTable( + name: "PRoute", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Path = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ComponentPath = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + RouteType = table.Column(type: "nvarchar(max)", nullable: true), + Authority = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PRoute", x => x.Id); + }); + + migrationBuilder.AddForeignKey( + name: "FK_PBlogPost_PBlogCategory_CategoryId", + table: "PBlogPost", + column: "CategoryId", + principalTable: "PBlogCategory", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_PForumPost_PForumPost_ParentPostId", + table: "PForumPost", + column: "ParentPostId", + principalTable: "PForumPost", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_PForumPost_PForumTopic_TopicId", + table: "PForumPost", + column: "TopicId", + principalTable: "PForumTopic", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_PForumTopic_PForumCategory_CategoryId", + table: "PForumTopic", + column: "CategoryId", + principalTable: "PForumCategory", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_PBlogPost_PBlogCategory_CategoryId", + table: "PBlogPost"); + + migrationBuilder.DropForeignKey( + name: "FK_PForumPost_PForumPost_ParentPostId", + table: "PForumPost"); + + migrationBuilder.DropForeignKey( + name: "FK_PForumPost_PForumTopic_TopicId", + table: "PForumPost"); + + migrationBuilder.DropForeignKey( + name: "FK_PForumTopic_PForumCategory_CategoryId", + table: "PForumTopic"); + + migrationBuilder.DropTable( + name: "PRoute"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PForumTopic", + table: "PForumTopic"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PForumPost", + table: "PForumPost"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PForumCategory", + table: "PForumCategory"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PBlogPost", + table: "PBlogPost"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PBlogCategory", + table: "PBlogCategory"); + + migrationBuilder.RenameTable( + name: "PForumTopic", + newName: "PForumTopics"); + + migrationBuilder.RenameTable( + name: "PForumPost", + newName: "PForumPosts"); + + migrationBuilder.RenameTable( + name: "PForumCategory", + newName: "PForumCategories"); + + migrationBuilder.RenameTable( + name: "PBlogPost", + newName: "PBlogPosts"); + + migrationBuilder.RenameTable( + name: "PBlogCategory", + newName: "PBlogCategories"); + + migrationBuilder.RenameIndex( + name: "IX_PForumTopic_LastPostDate", + table: "PForumTopics", + newName: "IX_PForumTopics_LastPostDate"); + + migrationBuilder.RenameIndex( + name: "IX_PForumTopic_IsPinned", + table: "PForumTopics", + newName: "IX_PForumTopics_IsPinned"); + + migrationBuilder.RenameIndex( + name: "IX_PForumTopic_CategoryId", + table: "PForumTopics", + newName: "IX_PForumTopics_CategoryId"); + + migrationBuilder.RenameIndex( + name: "IX_PForumPost_TopicId", + table: "PForumPosts", + newName: "IX_PForumPosts_TopicId"); + + migrationBuilder.RenameIndex( + name: "IX_PForumPost_ParentPostId", + table: "PForumPosts", + newName: "IX_PForumPosts_ParentPostId"); + + migrationBuilder.RenameIndex( + name: "IX_PForumCategory_DisplayOrder", + table: "PForumCategories", + newName: "IX_PForumCategories_DisplayOrder"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPost_Slug", + table: "PBlogPosts", + newName: "IX_PBlogPosts_Slug"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPost_PublishedAt", + table: "PBlogPosts", + newName: "IX_PBlogPosts_PublishedAt"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPost_IsPublished", + table: "PBlogPosts", + newName: "IX_PBlogPosts_IsPublished"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogPost_CategoryId", + table: "PBlogPosts", + newName: "IX_PBlogPosts_CategoryId"); + + migrationBuilder.RenameIndex( + name: "IX_PBlogCategory_Slug", + table: "PBlogCategories", + newName: "IX_PBlogCategories_Slug"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PForumTopics", + table: "PForumTopics", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PForumPosts", + table: "PForumPosts", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PForumCategories", + table: "PForumCategories", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PBlogPosts", + table: "PBlogPosts", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PBlogCategories", + table: "PBlogCategories", + column: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_PBlogPosts_PBlogCategories_CategoryId", + table: "PBlogPosts", + column: "CategoryId", + principalTable: "PBlogCategories", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_PForumPosts_PForumPosts_ParentPostId", + table: "PForumPosts", + column: "ParentPostId", + principalTable: "PForumPosts", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_PForumPosts_PForumTopics_TopicId", + table: "PForumPosts", + column: "TopicId", + principalTable: "PForumTopics", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_PForumTopics_PForumCategories_CategoryId", + table: "PForumTopics", + column: "CategoryId", + principalTable: "PForumCategories", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index e5f70e23..073f63eb 100644 --- a/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Kurs.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -946,7 +946,7 @@ namespace Kurs.Platform.Migrations b.HasIndex("Slug"); - b.ToTable("PBlogCategories", (string)null); + b.ToTable("PBlogCategory", (string)null); }); modelBuilder.Entity("Kurs.Platform.Entities.BlogPost", b => @@ -1060,7 +1060,7 @@ namespace Kurs.Platform.Migrations b.HasIndex("Slug"); - b.ToTable("PBlogPosts", (string)null); + b.ToTable("PBlogPost", (string)null); }); modelBuilder.Entity("Kurs.Platform.Entities.Branch", b => @@ -2269,6 +2269,79 @@ namespace Kurs.Platform.Migrations b.ToTable("PPublicApi", (string)null); }); + modelBuilder.Entity("Kurs.Platform.Entities.Route", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Authority") + .HasColumnType("nvarchar(max)"); + + b.Property("ComponentPath") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Path") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("RouteType") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PRoute", (string)null); + }); + modelBuilder.Entity("Kurs.Platform.Entities.Sector", b => { b.Property("Id") @@ -2519,7 +2592,7 @@ namespace Kurs.Platform.Migrations b.HasIndex("DisplayOrder"); - b.ToTable("PForumCategories", (string)null); + b.ToTable("PForumCategory", (string)null); }); modelBuilder.Entity("Kurs.Platform.Forum.ForumPost", b => @@ -2588,7 +2661,7 @@ namespace Kurs.Platform.Migrations b.HasIndex("TopicId"); - b.ToTable("PForumPosts", (string)null); + b.ToTable("PForumPost", (string)null); }); modelBuilder.Entity("Kurs.Platform.Forum.ForumTopic", b => @@ -2685,7 +2758,7 @@ namespace Kurs.Platform.Migrations b.HasIndex("LastPostDate"); - b.ToTable("PForumTopics", (string)null); + b.ToTable("PForumTopic", (string)null); }); modelBuilder.Entity("Kurs.Settings.Entities.SettingDefinition", b => diff --git a/ui/dev-dist/sw.js b/ui/dev-dist/sw.js index 5fdb83ae..7f5ca002 100644 --- a/ui/dev-dist/sw.js +++ b/ui/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.kii9phg4rp8" + "revision": "0.vvrlobooaco" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 4d99f7d7..ebeccb29 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -3,21 +3,23 @@ import Theme from '@/components/template/Theme' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { StoreProvider } from 'easy-peasy' import { BrowserRouter } from 'react-router-dom' -import history from './history' import './locales' import { store } from './store' +import { DynamicRoutesProvider } from './routes/dynamicRoutesContext' const queryClient = new QueryClient() function App() { return ( - - - - - - + + + + + + + + ) diff --git a/ui/src/components/layouts/AuthLayout/AuthLayout.tsx b/ui/src/components/layouts/AuthLayout/AuthLayout.tsx index ddd6d0c6..3d4c4b90 100644 --- a/ui/src/components/layouts/AuthLayout/AuthLayout.tsx +++ b/ui/src/components/layouts/AuthLayout/AuthLayout.tsx @@ -4,7 +4,6 @@ import Simple from './Simple' import View from '@/views' import { useStoreState } from '@/store' import { LAYOUT_TYPE_BLANK } from '@/constants/theme.constant' -import { HiArrowLeft } from 'react-icons/hi' const AuthLayout = () => { const layoutType = useStoreState((state) => state.theme.layout.type) diff --git a/ui/src/components/layouts/ClassicLayout.tsx b/ui/src/components/layouts/ClassicLayout.tsx index f85b5efc..3fba41d9 100644 --- a/ui/src/components/layouts/ClassicLayout.tsx +++ b/ui/src/components/layouts/ClassicLayout.tsx @@ -6,11 +6,11 @@ import SideNavToggle from '@/components/template/SideNavToggle' import SidePanel from '@/components/template/SidePanel' import UserDropdown from '@/components/template/UserDropdown' import { useStoreState } from '@/store' -import View from '@/views' import LanguageSelector from '../template/LanguageSelector' import Search from '../template/Search' import StackedSideNav from '../template/StackedSideNav' import AiAssistant from '../template/AiAssistant' +import { DynamicRouter } from '@/routes/dynamicRouter' const HeaderActionsStart = () => { return ( @@ -48,7 +48,7 @@ const ClassicLayout = () => { headerEnd={} />
- +
diff --git a/ui/src/components/template/AiAssistant.tsx b/ui/src/components/template/AiAssistant.tsx index 61cc30a9..5eaba1e7 100644 --- a/ui/src/components/template/AiAssistant.tsx +++ b/ui/src/components/template/AiAssistant.tsx @@ -1,4 +1,5 @@ import Tooltip from '@/components/ui/Tooltip' +import { ROUTES_ENUM } from '@/routes/route.constant' import { useLocalization } from '@/utils/hooks/useLocalization' import { Helmet } from 'react-helmet' import { FcAssistant } from 'react-icons/fc' @@ -17,7 +18,7 @@ const AiAssistant = () => { >
navigate('/ai')} + onClick={() => navigate(ROUTES_ENUM.protected.admin.ai)} className="flex items-center justify-center w-9 h-9 m-2 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors duration-200" > diff --git a/ui/src/components/template/Footer.tsx b/ui/src/components/template/Footer.tsx index 35e82ef0..9f82c2c2 100644 --- a/ui/src/components/template/Footer.tsx +++ b/ui/src/components/template/Footer.tsx @@ -4,7 +4,7 @@ import { APP_NAME } from '@/constants/app.constant' import { PAGE_CONTAINER_GUTTER_X } from '@/constants/theme.constant' import { useStoreActions, useStoreState } from '@/store' import { Link, useNavigate } from 'react-router-dom' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import UiDialog from '@/views/shared/UiDialog' export type FooterPageContainerType = 'gutterless' | 'contained' @@ -30,7 +30,7 @@ const FooterContent = () => { Copyright © {new Date().getFullYear()} {APP_NAME}
- +
UI: @@ -53,7 +53,7 @@ const FooterContent = () => { type="info" onConfirm={() => { setUiVersion(reactAppVersion ) - navigate(ROUTES_ENUM.docs.changelog) + navigate(ROUTES_ENUM.protected.admin.changeLog) }} title="🎉 Yeni Güncelleme" > diff --git a/ui/src/components/template/Notification.tsx b/ui/src/components/template/Notification.tsx index cf00ccc1..c6d924c9 100644 --- a/ui/src/components/template/Notification.tsx +++ b/ui/src/components/template/Notification.tsx @@ -7,7 +7,7 @@ import Spinner from '@/components/ui/Spinner' import Tooltip from '@/components/ui/Tooltip' import { AVATAR_URL } from '@/constants/app.constant' import NotificationChannels from '@/constants/notification-channel.enum' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { getList, updateRead, @@ -329,7 +329,7 @@ const _Notification = ({ className }: { className?: string }) => {
{translate('::Abp.Identity.ActivityLogs.ViewAllActivity')} diff --git a/ui/src/components/template/UserDropdown.tsx b/ui/src/components/template/UserDropdown.tsx index dcb81ac8..e00d1297 100644 --- a/ui/src/components/template/UserDropdown.tsx +++ b/ui/src/components/template/UserDropdown.tsx @@ -1,6 +1,6 @@ import type { CommonProps } from '@/@types/common' import Dropdown from '@/components/ui/Dropdown' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { useStoreState } from '@/store' import withHeaderItem from '@/utils/hoc/withHeaderItem' import useAuth from '@/utils/hooks/useAuth' @@ -26,12 +26,12 @@ const _UserDropdown = ({ className }: CommonProps) => { const dropdownItemList: DropdownList[] = [ { label: translate('::Abp.Identity.Profile'), - path: ROUTES_ENUM.account.profile, + path: ROUTES_ENUM.protected.admin.profile.general, icon: , }, { label: translate('::Abp.Identity.ActivityLogs'), - path: ROUTES_ENUM.admin.activityLogs, + path: ROUTES_ENUM.protected.admin.activityLog, icon: , }, ] diff --git a/ui/src/configs/app.config.ts b/ui/src/configs/app.config.ts index a4746b5c..fb45e5e3 100644 --- a/ui/src/configs/app.config.ts +++ b/ui/src/configs/app.config.ts @@ -1,4 +1,4 @@ -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from "@/routes/route.constant" export type AppConfig = { baseUrl: string @@ -13,8 +13,8 @@ export type AppConfig = { const appConfig: AppConfig = { baseUrl: import.meta.env.VITE_API_URL, apiPrefix: '/api', - authenticatedEntryPath: '/home', - unAuthenticatedEntryPath: ROUTES_ENUM.account.login, + authenticatedEntryPath: ROUTES_ENUM.protected.admin.home, + unAuthenticatedEntryPath: ROUTES_ENUM.public.login, tourPath: '/', locale: 'en', uiVersion : undefined diff --git a/ui/src/configs/routes.config/adminRoutes.tsx b/ui/src/configs/routes.config/adminRoutes.tsx deleted file mode 100644 index b73968a4..00000000 --- a/ui/src/configs/routes.config/adminRoutes.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import type { Routes } from '@/@types/routes' -import { ROUTES_ENUM } from '@/constants/route.constant' -import { lazy } from 'react' - -const adminRoutes: Routes = [ - { - key: ROUTES_ENUM.admin.tenantmanagement, - path: ROUTES_ENUM.admin.tenantmanagement, - component: lazy(() => import('@/views/admin/tenant-management')), - authority: [], //TODO - }, - { - key: ROUTES_ENUM.admin.identity.roles, - path: ROUTES_ENUM.admin.identity.roles, - component: lazy(() => import('@/views/admin/identity/Roles')), - authority: [], //TODO - }, - { - key: ROUTES_ENUM.admin.identity.users.view, - path: ROUTES_ENUM.admin.identity.users.view, - component: lazy(() => import('@/views/admin/identity/Users')), - authority: [], //TODO - }, - { - key: ROUTES_ENUM.admin.identity.users.details, - path: ROUTES_ENUM.admin.identity.users.details, - component: lazy(() => import('@/views/admin/identity/Users/Details')), - authority: [], //TODO - }, - { - key: ROUTES_ENUM.admin.organizationUnits, - path: ROUTES_ENUM.admin.organizationUnits, - component: lazy(() => import('@/views/admin/organization-unit/OrganizationUnits')), - authority: [], - }, - { - key: ROUTES_ENUM.admin.activityLogs, - path: ROUTES_ENUM.admin.activityLogs, - component: lazy(() => import('@/views/admin/activityLog')), - authority: [], - }, - { - key: ROUTES_ENUM.admin.listFormManagement.wizard, - path: ROUTES_ENUM.admin.listFormManagement.wizard, - component: lazy(() => import('@/views/admin/listForm/Wizard')), - authority: [], - }, - { - key: ROUTES_ENUM.admin.listFormManagement.edit, - path: ROUTES_ENUM.admin.listFormManagement.edit, - component: lazy(() => import('@/views/admin/listForm/edit/FormEdit')), - authority: [], - }, - { - key: ROUTES_ENUM.admin.chart, - path: ROUTES_ENUM.admin.chart, - component: lazy(() => import('@/views/admin/chart/ChartEdit')), - authority: [], - }, - { - key: ROUTES_ENUM.admin.forum.management, - path: ROUTES_ENUM.admin.forum.management, - component: lazy(() => import('@/views/forum/Management')), - authority: [], - }, - { - key: ROUTES_ENUM.admin.forum.view, - path: ROUTES_ENUM.admin.forum.view, - component: lazy(() => import('@/views/forum/Forum')), - authority: [], - }, -] - -export { adminRoutes } diff --git a/ui/src/configs/routes.config/authRoute.tsx b/ui/src/configs/routes.config/authRoute.tsx deleted file mode 100644 index 45d6c9a9..00000000 --- a/ui/src/configs/routes.config/authRoute.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { Routes } from '@/@types/routes' -import { ROUTES_ENUM } from '@/constants/route.constant' -import { lazy } from 'react' - -const publicAuthRoutes: Routes = [ - { - key: ROUTES_ENUM.account.login, - path: ROUTES_ENUM.account.login, - component: lazy(() => import('@/views/auth/Login')), - authority: [], - }, - { - key: ROUTES_ENUM.account.register, - path: ROUTES_ENUM.account.register, - component: lazy(() => import('@/views/auth/Register')), - authority: [], - }, - { - key: ROUTES_ENUM.account.forgotPassword, - path: ROUTES_ENUM.account.forgotPassword, - component: lazy(() => import('@/views/auth/ForgotPassword')), - authority: [], - }, - { - key: ROUTES_ENUM.account.resetPassword, - path: ROUTES_ENUM.account.resetPassword, - component: lazy(() => import('@/views/auth/ResetPassword')), - authority: [], - }, - { - key: ROUTES_ENUM.account.sendConfirmationCode, - path: ROUTES_ENUM.account.sendConfirmationCode, - component: lazy(() => import('@/views/auth/SendConfirmationCode')), - authority: [], - }, - { - key: ROUTES_ENUM.account.verifyConfirmationCode, - path: ROUTES_ENUM.account.verifyConfirmationCode, - component: lazy(() => import('@/views/auth/VerifyConfirmationCode')), - authority: [], - }, - { - key: ROUTES_ENUM.account.sendExtendLogin, - path: ROUTES_ENUM.account.sendExtendLogin, - component: lazy(() => import('@/views/auth/ExtendLogin')), - authority: [], - }, -] - -const protectedAuthRoutes: Routes = [ - { - key: ROUTES_ENUM.account.changePassword, - path: ROUTES_ENUM.account.changePassword, - component: lazy(() => import('@/views/auth/Settings')), - authority: [], - }, - { - key: ROUTES_ENUM.account.profile, - path: ROUTES_ENUM.account.profile, - component: lazy(() => import('@/views/auth/Settings')), - authority: [], - }, - { - key: ROUTES_ENUM.account.notificationSettings, - path: ROUTES_ENUM.account.notificationSettings, - component: lazy(() => import('@/views/auth/Settings')), - authority: [], - }, -] - -export { protectedAuthRoutes, publicAuthRoutes } - -// { -// key: ROUTES_ENUM.account.login, -// path: `${APP_PREFIX_PATH}/account/settings/:tab`, -// component: lazy(() => import('@/views/account/Settings')), -// authority: [ADMIN, USER], -// meta: { -// header: 'Settings', -// headerContainer: true, -// }, -// }, diff --git a/ui/src/configs/routes.config/index.ts b/ui/src/configs/routes.config/index.ts deleted file mode 100644 index af3a4a7e..00000000 --- a/ui/src/configs/routes.config/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { protectedRoutes, publicRoutes } from './routes.config' diff --git a/ui/src/configs/routes.config/routes.config.ts b/ui/src/configs/routes.config/routes.config.ts deleted file mode 100644 index 71c3b659..00000000 --- a/ui/src/configs/routes.config/routes.config.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { Routes } from '@/@types/routes' -import { ROUTES_ENUM } from '@/constants/route.constant' -import { lazy } from 'react' -import { adminRoutes } from './adminRoutes' -import { protectedAuthRoutes, publicAuthRoutes } from './authRoute' - -export const publicRoutes: Routes = [...publicAuthRoutes] - -export const protectedRoutes: Routes = [ - { - key: '/', - path: '/home', - component: lazy(() => import('@/views/Home')), - authority: [], - }, - { - key: '/ai', - path: '/ai', - component: lazy(() => import('@/views/ai/Assistant')), - authority: [], - }, - { - key: '/access-denied', - path: '/access-denied', - component: lazy(() => import('@/views/AccessDenied')), - authority: [], - }, - ...protectedAuthRoutes, - ...adminRoutes, - { - key: ROUTES_ENUM.settings, - path: ROUTES_ENUM.settings, - component: lazy(() => import('@/views/settings/Settings')), - authority: [], - }, - { - key: ROUTES_ENUM.list, - path: ROUTES_ENUM.list, - component: lazy(() => import('@/views/list/List')), - authority: [], - }, - { - key: ROUTES_ENUM.formNew, - path: ROUTES_ENUM.formNew, - component: lazy(() => import('@/views/form/FormNew')), - authority: [], - }, - { - key: ROUTES_ENUM.formView, - path: ROUTES_ENUM.formView, - component: lazy(() => import('@/views/form/FormView')), - authority: [], - }, - { - key: ROUTES_ENUM.formEdit, - path: ROUTES_ENUM.formEdit, - component: lazy(() => import('@/views/form/FormEdit')), - authority: [], - }, - { - key: ROUTES_ENUM.chart, - path: ROUTES_ENUM.chart, - component: lazy(() => import('@/views/chart/Chart')), - authority: [], - }, - { - key: ROUTES_ENUM.pivot, - path: ROUTES_ENUM.pivot, - component: lazy(() => import('@/views/list/ListPivot')), - authority: [], - }, - { - key: ROUTES_ENUM.docs.changelog, - path: ROUTES_ENUM.docs.changelog, - component: lazy(() => import('@/views/docs/ChangeLog')), - authority: [], - }, - { - key: ROUTES_ENUM.menumanager, - path: ROUTES_ENUM.menumanager, - component: lazy(() => import('@/views/menu/MenuManager')), - authority: [], - }, -] diff --git a/ui/src/constants/route.constant.ts b/ui/src/constants/route.constant.ts deleted file mode 100644 index 27c8c075..00000000 --- a/ui/src/constants/route.constant.ts +++ /dev/null @@ -1,54 +0,0 @@ -export const ROOT = '/' -export const APP_PREFIX_PATH = '/app' -export const AUTH_PREFIX_PATH = '/auth' -export const UI_COMPONENTS_PREFIX_PATH = '/ui-components' -export const PAGES_PREFIX_PATH = '/pages' -export const DOCS_PREFIX_PATH = '/docs' - -export const ROUTES_ENUM = { - account: { - login: '/account/login', - register: '/account/register', - forgotPassword: '/account/forgot-password', - resetPassword: '/account/reset-password', - sendConfirmationCode: '/account/confirm', - sendExtendLogin: '/account/extend-login', - verifyConfirmationCode: '/account/confirm/:userId/:token', - settings: '/account/settings', - changePassword: '/account/settings/password', - profile: '/account/settings/profile', - notificationSettings: '/account/settings/notification-settings', - }, - admin: { - tenantmanagement: '/admin/tenant-management', - identity: { - roles: '/admin/identity/roles', - users: { - view: '/admin/identity/users', - details: '/admin/identity/users/detail/:userId', - }, - }, - activityLogs: '/admin/activityLog', - organizationUnits: '/admin/ous', - listFormManagement: { - wizard: '/admin/listform/wizard', - edit: '/admin/listform/edit/:listFormCode', - }, - chart: '/admin/chart/edit/:chartCode', - forum: { - view: '/admin/forum', - management: '/admin/forummanagement', - }, - }, - settings: '/settings', - list: '/list/:listFormCode', - formNew: '/form/:listFormCode', - formView: '/form/:listFormCode/:id', - formEdit: '/form/:listFormCode/:id/edit', - chart: '/chart/:chartCode', - pivot: '/pivot/:listFormCode', - docs: { - changelog: '/docs/changelog' - }, - menumanager: '/menumanager', -} diff --git a/ui/src/proxy/routes/index.ts b/ui/src/proxy/routes/index.ts new file mode 100644 index 00000000..ad200c53 --- /dev/null +++ b/ui/src/proxy/routes/index.ts @@ -0,0 +1 @@ +export * from './models' diff --git a/ui/src/proxy/routes/models.ts b/ui/src/proxy/routes/models.ts new file mode 100644 index 00000000..783763c8 --- /dev/null +++ b/ui/src/proxy/routes/models.ts @@ -0,0 +1,10 @@ +import { FullAuditedEntityDto } from '../abp' + +export interface RouteDto extends FullAuditedEntityDto { + id: string; + key: string; + path: string; + componentPath: string; + routeType: string; + authority: string[]; +} diff --git a/ui/src/routes/dynamicRouteLoader.tsx b/ui/src/routes/dynamicRouteLoader.tsx new file mode 100644 index 00000000..3c5a30f1 --- /dev/null +++ b/ui/src/routes/dynamicRouteLoader.tsx @@ -0,0 +1,46 @@ +import { RouteDto } from '@/proxy/routes' +import { lazy } from 'react' + +// Tüm view bileşenlerini import et (vite özel) +const modules = import.meta.glob('../views/**/*.tsx') + +const lazyComponentCache = new Map>>() + +export function loadComponent(componentPath: string) { + const cleanedPath = componentPath.replace(/^@\//, '') + const fullPath = `../${cleanedPath}.tsx` + + if (lazyComponentCache.has(fullPath)) { + return lazyComponentCache.get(fullPath)! + } + + const loader = modules[fullPath] + if (!loader) { + console.error(`Component not found for path: ${fullPath}`) + throw new Error(`Component not found for path: ${fullPath}`) + } + + const LazyComponent = lazy(loader as () => Promise<{ default: React.ComponentType }>) + lazyComponentCache.set(fullPath, LazyComponent) + return LazyComponent +} + +// React Router için uygun bir route tipi +export interface DynamicReactRoute { + key: string; + path: string; + getComponent: () => React.LazyExoticComponent>; + routeType: string; + authority?: string[]; +} + +// API'den gelen route objesini, React Router için uygun hale getirir +export function mapDynamicRoutes(routes: RouteDto[]): DynamicReactRoute[] { + return routes.map((route) => ({ + key: route.path, + path: route.path, + getComponent: () => loadComponent(route.componentPath), + routeType: route.routeType, + authority: route.authority, + })); +} diff --git a/ui/src/routes/dynamicRouter.tsx b/ui/src/routes/dynamicRouter.tsx new file mode 100644 index 00000000..c19a1fd3 --- /dev/null +++ b/ui/src/routes/dynamicRouter.tsx @@ -0,0 +1,69 @@ +import React, { useMemo } from 'react' +import { Routes, Route, Navigate } from 'react-router-dom' +import { mapDynamicRoutes } from './dynamicRouteLoader' +import { useDynamicRoutes } from './dynamicRoutesContext' +import NotFound from '@/views/NotFound' +import ProtectedRoute from '@/components/route/ProtectedRoute' +import PermissionGuard from '@/components/route/PermissionGuard' +import PageContainer from '@/components/template/PageContainer' +import { ROUTES_ENUM } from './route.constant' + +export const DynamicRouter: React.FC = () => { + const { routes, loading, error } = useDynamicRoutes() + + const dynamicRoutes = useMemo(() => mapDynamicRoutes(routes), [routes]) + + if (loading) return
Loading...
+ if (error) return
Hata: {error}
+ + return ( + + {/* Protected Routes */} + }> + {dynamicRoutes + .filter((r) => r.routeType === 'protected') + .map((route) => { + const Component = route.getComponent() + return ( + + + Loading {route.path}...
}> + + + + + } + /> + ) + })} + + } /> + + + {/* Public Routes */} + {dynamicRoutes + .filter((r) => r.routeType === 'public') + .map((route) => { + const Component = route.getComponent() + return ( + Loading {route.path}...
}> + + + } + /> + ) + })} + + {/* Not Found */} + } /> + + ) +} diff --git a/ui/src/routes/dynamicRoutesContext.tsx b/ui/src/routes/dynamicRoutesContext.tsx new file mode 100644 index 00000000..0485ba69 --- /dev/null +++ b/ui/src/routes/dynamicRoutesContext.tsx @@ -0,0 +1,54 @@ +import { RouteDto } from '@/proxy/routes' +import { RouteService } from '@/services/route.service' +import React, { createContext, useContext, useEffect, useState } from 'react' + +interface DynamicRoutesContextProps { + routes: RouteDto[] + loading: boolean + error: string | null + reload: () => void +} + +const DynamicRoutesContext = createContext(undefined) + +export const useDynamicRoutes = () => { + const ctx = useContext(DynamicRoutesContext) + if (!ctx) throw new Error('useDynamicRoutes must be used within DynamicRoutesProvider') + return ctx +} + +export const DynamicRoutesProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [routes, setRoutes] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + const fetchRoutes = async () => { + setLoading(true) + setError(null) + + try { + const routeService = new RouteService() + const res = await routeService.getRoutes() + + if (res.data) { + setRoutes(res.data) + } else { + throw new Error('No routes found') + } + } catch (e: any) { + setError(e.message || 'Unknown error') + } finally { + setLoading(false) + } + } + + useEffect(() => { + fetchRoutes() + }, []) + + return ( + + {children} + + ) +} diff --git a/ui/src/routes/route.constant.ts b/ui/src/routes/route.constant.ts new file mode 100644 index 00000000..bb751bd2 --- /dev/null +++ b/ui/src/routes/route.constant.ts @@ -0,0 +1,53 @@ +export const ROUTES_ENUM = { + public: { + login: '/login', + register: '/register', + forgotPassword: '/forgot-password', + resetPassword: '/reset-password', + sendConfirmationCode: '/confirm', + sendExtendLogin: '/extend-login', + verifyConfirmationCode: '/confirm/:userId/:token', + }, + protected: { + root: '/home', + saas: { + menuManager: '/saas/menuManager', + listFormManagement: { + wizard: '/saas/listform/wizard', + edit: '/saas/listform/edit/:listFormCode', + }, + chartManagement: { + edit: '/saas/chart/edit/:chartCode', + }, + forumManagement: '/admin/forumManagement', + }, + + admin: { + home: '/home', + ai: '/admin/ai', + profile: { + general: '/admin/settings/general', + password: '/admin/settings/password', + notificationSettings: '/admin/settings/notification-settings', + }, + activityLog: '/admin/activityLog', + changeLog: '/admin/changeLog', + + settings: '/admin/settings', + identity: { + user: { + detail: '/admin/users/detail/:userId', + }, + ous: '/admin/ous', + }, + forum: '/admin/forum', + + list: '/admin/list/:listFormCode', + formNew: '/admin/form/:listFormCode', + formView: '/admin/form/:listFormCode/:id', + formEdit: '/admin/form/:listFormCode/:id/edit', + chart: '/admin/chart/:chartCode', + pivot: '/admin/pivot/:listFormCode', + }, + }, +} diff --git a/ui/src/services/route.service.ts b/ui/src/services/route.service.ts new file mode 100644 index 00000000..1a5c4f91 --- /dev/null +++ b/ui/src/services/route.service.ts @@ -0,0 +1,18 @@ +import { RouteDto } from '@/proxy/routes' +import apiService, { Config } from '@/services/api.service' + +export class RouteService { + apiName = 'Default' + + getRoutes = (config?: Partial) => + apiService.fetchData( + { + method: 'GET', + url: '/api/app/route', + }, + { apiName: this.apiName, ...config }, + ) +} + +const routeService = new RouteService() +export default routeService diff --git a/ui/src/store/base.model.ts b/ui/src/store/base.model.ts index 92af86c2..b7190a55 100644 --- a/ui/src/store/base.model.ts +++ b/ui/src/store/base.model.ts @@ -94,7 +94,7 @@ export const baseModel: BaseModel = { }), addAiPost: action((state, payload) => { state.aiPosts = [...state.aiPosts, payload] - localStorage.setItem('aiPosts', JSON.stringify(state.aiPosts)) + localStorage.setItem('AiPosts', JSON.stringify(state.aiPosts)) }), setAiPosts: action((state, payload) => { diff --git a/ui/src/utils/hooks/useAuth.ts b/ui/src/utils/hooks/useAuth.ts index 9cd798e6..843aba72 100644 --- a/ui/src/utils/hooks/useAuth.ts +++ b/ui/src/utils/hooks/useAuth.ts @@ -65,9 +65,7 @@ function useAuth() { handleToken({ token, refreshToken, expiresIn }) const redirectUrl = query.get(REDIRECT_URL_KEY) - setTimeout(() => { - navigate(redirectUrl ?? appConfig.authenticatedEntryPath) - }, 2000) + navigate(redirectUrl ?? appConfig.authenticatedEntryPath) return { status: 'success', diff --git a/ui/src/views/NotFound.tsx b/ui/src/views/NotFound.tsx new file mode 100644 index 00000000..59147c3b --- /dev/null +++ b/ui/src/views/NotFound.tsx @@ -0,0 +1,13 @@ +import React, { useEffect, useRef } from 'react' + +const NotFoundPage = () => { + return ( +
+
+ 404 +
+
+ ) +} + +export default NotFoundPage diff --git a/ui/src/views/Views.tsx b/ui/src/views/Views.tsx index 9c925f80..859d298e 100644 --- a/ui/src/views/Views.tsx +++ b/ui/src/views/Views.tsx @@ -1,64 +1,21 @@ import type { LayoutType } from '@/@types/theme' -import AppRoute from '@/components/route/AppRoute' -import PermissionGuard from '@/components/route/PermissionGuard' -import ProtectedRoute from '@/components/route/ProtectedRoute' -import PublicRoute from '@/components/route/PublicRoute' import Loading from '@/components/shared/Loading' -import PageContainer from '@/components/template/PageContainer' import { Alert, Button } from '@/components/ui' -import appConfig from '@/configs/app.config' -import { protectedRoutes, publicRoutes } from '@/configs/routes.config' import { store, useStoreState } from '@/store' import { Suspense, useEffect } from 'react' import { ErrorBoundary } from 'react-error-boundary' import { MdArrowBack } from 'react-icons/md' -import { Navigate, Route, Routes, useLocation } from 'react-router-dom' +import { useLocation } from 'react-router-dom' import DialogProvider from './shared/DialogContext' import DialogShowComponent from './shared/DialogContext/DialogShowComponent' import UiDialog from './shared/UiDialog' +import { DynamicRouter } from '@/routes/dynamicRouter' interface ViewsProps { pageContainerType?: 'default' | 'gutterless' | 'contained' layout?: LayoutType } -type AllRoutesProps = ViewsProps - -const { authenticatedEntryPath } = appConfig - -const AllRoutes = (props: AllRoutesProps) => { - return ( - - }> - } /> - {protectedRoutes.map((route, index) => ( - - - - - - } - /> - ))} - } /> - - }> - {publicRoutes.map((route) => ( - } - /> - ))} - - - ) -} - function fallbackRender({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: any }) { return ( @@ -110,7 +67,7 @@ const Views = (props: ViewsProps) => { ))} - + diff --git a/ui/src/views/admin/activityLog/index.ts b/ui/src/views/admin/activityLog/index.ts deleted file mode 100644 index 4c5cb6e6..00000000 --- a/ui/src/views/admin/activityLog/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ActivityLog from './ActivityLog' - -export default ActivityLog diff --git a/ui/src/views/admin/identity/Roles/index.ts b/ui/src/views/admin/identity/Roles/index.ts deleted file mode 100644 index 392c9545..00000000 --- a/ui/src/views/admin/identity/Roles/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Roles from './Roles' - -export default Roles diff --git a/ui/src/views/admin/identity/Users/index.ts b/ui/src/views/admin/identity/Users/index.ts deleted file mode 100644 index 84ebb107..00000000 --- a/ui/src/views/admin/identity/Users/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Users from './Users' - -export default Users diff --git a/ui/src/views/admin/listForm/Wizard.tsx b/ui/src/views/admin/listForm/Wizard.tsx index d03a6bba..492f9605 100644 --- a/ui/src/views/admin/listForm/Wizard.tsx +++ b/ui/src/views/admin/listForm/Wizard.tsx @@ -8,7 +8,7 @@ import { Select, toast, } from '@/components/ui' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { getPermissions } from '@/proxy/admin/identity.service' import { postListFormWizard } from '@/proxy/admin/list-form/list-form.service' import { ListFormWizardDto } from '@/proxy/admin/list-form/models' @@ -156,7 +156,7 @@ const Wizard = () => { setSubmitting(false) setTimeout(() => { navigate( - ROUTES_ENUM.admin.listFormManagement.edit.replace( + ROUTES_ENUM.protected.saas.listFormManagement.edit.replace( ':listFormCode', values.listFormCode, ), diff --git a/ui/src/views/admin/identity/Roles/Roles.tsx b/ui/src/views/admin/role-management/Roles.tsx similarity index 100% rename from ui/src/views/admin/identity/Roles/Roles.tsx rename to ui/src/views/admin/role-management/Roles.tsx diff --git a/ui/src/views/admin/identity/Roles/RolesPermission.tsx b/ui/src/views/admin/role-management/RolesPermission.tsx similarity index 100% rename from ui/src/views/admin/identity/Roles/RolesPermission.tsx rename to ui/src/views/admin/role-management/RolesPermission.tsx diff --git a/ui/src/views/admin/tenant-management/index.ts b/ui/src/views/admin/tenant-management/index.ts deleted file mode 100644 index a0280cc0..00000000 --- a/ui/src/views/admin/tenant-management/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Tenants from './Tenants' - -export default Tenants diff --git a/ui/src/views/admin/identity/Users/Details.tsx b/ui/src/views/admin/user-management/Details.tsx similarity index 100% rename from ui/src/views/admin/identity/Users/Details.tsx rename to ui/src/views/admin/user-management/Details.tsx diff --git a/ui/src/views/admin/identity/Users/Users.tsx b/ui/src/views/admin/user-management/Users.tsx similarity index 100% rename from ui/src/views/admin/identity/Users/Users.tsx rename to ui/src/views/admin/user-management/Users.tsx diff --git a/ui/src/views/admin/identity/Users/UsersPermission.tsx b/ui/src/views/admin/user-management/UsersPermission.tsx similarity index 100% rename from ui/src/views/admin/identity/Users/UsersPermission.tsx rename to ui/src/views/admin/user-management/UsersPermission.tsx diff --git a/ui/src/views/ai/LoadAiPostsFromLocalStorage.tsx b/ui/src/views/ai/LoadAiPostsFromLocalStorage.tsx index 25ce2eb7..62119e9c 100644 --- a/ui/src/views/ai/LoadAiPostsFromLocalStorage.tsx +++ b/ui/src/views/ai/LoadAiPostsFromLocalStorage.tsx @@ -5,7 +5,7 @@ const LoadAiPostsFromLocalStorage = () => { const setAiPosts = useStoreActions((actions) => actions.base.messages.setAiPosts) useEffect(() => { - const saved = localStorage.getItem('aiPosts') + const saved = localStorage.getItem('AiPosts') if (saved) { try { const parsed = JSON.parse(saved) diff --git a/ui/src/views/auth/ExtendLogin.tsx b/ui/src/views/auth/ExtendLogin.tsx index 7f354202..945fb966 100644 --- a/ui/src/views/auth/ExtendLogin.tsx +++ b/ui/src/views/auth/ExtendLogin.tsx @@ -4,7 +4,7 @@ import Alert from '@/components/ui/Alert' import Button from '@/components/ui/Button' import { FormContainer, FormItem } from '@/components/ui/Form' import Input from '@/components/ui/Input' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { sendExtendLoginRequest } from '@/proxy/account/account.service' import { store } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' @@ -26,7 +26,7 @@ const validationSchema = Yup.object().shape({ const ExtendLogin = () => { const { userName } = store.getState().auth.user const disableSubmit = false - const signInUrl = ROUTES_ENUM.account.login + const signInUrl = ROUTES_ENUM.public.login const [emailSent, setEmailSent] = useState(false) diff --git a/ui/src/views/auth/ForgotPassword.tsx b/ui/src/views/auth/ForgotPassword.tsx index 58a7dc2f..d1eb1ca3 100644 --- a/ui/src/views/auth/ForgotPassword.tsx +++ b/ui/src/views/auth/ForgotPassword.tsx @@ -4,7 +4,7 @@ import Alert from '@/components/ui/Alert' import Button from '@/components/ui/Button' import { FormContainer, FormItem } from '@/components/ui/Form' import Input from '@/components/ui/Input' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { sendPasswordResetCode } from '@/proxy/account/account.service' import { store } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' @@ -28,7 +28,7 @@ const validationSchema = Yup.object().shape({ const ForgotPassword = () => { const { userName } = store.getState().auth.user const disableSubmit = false - const signInUrl = ROUTES_ENUM.account.login + const signInUrl = ROUTES_ENUM.public.login const [emailSent, setEmailSent] = useState(false) diff --git a/ui/src/views/auth/Login.tsx b/ui/src/views/auth/Login.tsx index 8af1fe5f..06bdecb2 100644 --- a/ui/src/views/auth/Login.tsx +++ b/ui/src/views/auth/Login.tsx @@ -8,7 +8,7 @@ import Checkbox from '@/components/ui/Checkbox' import { FormContainer, FormItem } from '@/components/ui/Form' import Input from '@/components/ui/Input' import PlatformLoginResultType from '@/constants/login.result.enum' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { getTenantByName } from '@/proxy/admin/tenant/tenant.service' import { useStoreActions, useStoreState } from '@/store' import useAuth from '@/utils/hooks/useAuth' @@ -115,7 +115,7 @@ const Login = () => { if (data.pResult === PlatformLoginResultType.NotAllowed) { setWarningTimeout(data.description) - navigate(ROUTES_ENUM.account.sendConfirmationCode) + navigate(ROUTES_ENUM.public.sendConfirmationCode) } else { setWarning('') } @@ -149,14 +149,14 @@ const Login = () => { data.pResult === PlatformLoginResultType.ShouldChangePasswordPeriodic ) { setWarningTimeout(data.description) - navigate(ROUTES_ENUM.account.forgotPassword) + navigate(ROUTES_ENUM.public.forgotPassword) } else { setWarning('') } if (data.pResult === PlatformLoginResultType.LoginEndDateDue) { setWarningTimeout(data.description) - navigate(ROUTES_ENUM.account.sendExtendLogin) + navigate(ROUTES_ENUM.public.sendExtendLogin) } else { setWarning('') } @@ -301,7 +301,7 @@ const Login = () => { {translate('::Abp.Account.RememberMe')} - + {translate('::Abp.Account.ForgotPassword')} @@ -330,7 +330,7 @@ const Login = () => {
{translate('::Abp.Account.SignUp.Message')} - + {translate('::Abp.Account.Register')}
diff --git a/ui/src/views/auth/Register.tsx b/ui/src/views/auth/Register.tsx index ca791967..8da4ca27 100644 --- a/ui/src/views/auth/Register.tsx +++ b/ui/src/views/auth/Register.tsx @@ -4,7 +4,7 @@ import Alert from '@/components/ui/Alert' import Button from '@/components/ui/Button' import { FormContainer, FormItem } from '@/components/ui/Form' import Input from '@/components/ui/Input' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import useAuth from '@/utils/hooks/useAuth' import useTimeOutMessage from '@/utils/hooks/useTimeOutMessage' import Captcha from '@/components/shared/Captcha' @@ -31,7 +31,7 @@ const validationSchema = Yup.object().shape({ const Register = () => { const disableSubmit = false - const signInUrl = ROUTES_ENUM.account.login + const signInUrl = ROUTES_ENUM.public.login const { signUp } = useAuth() const { translate } = useLocalization() diff --git a/ui/src/views/auth/ResetPassword.tsx b/ui/src/views/auth/ResetPassword.tsx index 08d723e4..eb202fae 100644 --- a/ui/src/views/auth/ResetPassword.tsx +++ b/ui/src/views/auth/ResetPassword.tsx @@ -3,7 +3,7 @@ import PasswordInput from '@/components/shared/PasswordInput' import Alert from '@/components/ui/Alert' import Button from '@/components/ui/Button' import { FormContainer, FormItem } from '@/components/ui/Form' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { resetPassword } from '@/proxy/account/account.service' import { useLocalization } from '@/utils/hooks/useLocalization' import useTimeOutMessage from '@/utils/hooks/useTimeOutMessage' @@ -25,7 +25,7 @@ const validationSchema = Yup.object().shape({ const ResetPassword = () => { const disableSubmit = false - const signInUrl = ROUTES_ENUM.account.login + const signInUrl = ROUTES_ENUM.public.login const [searchParams] = useSearchParams() const userId = searchParams.get('userId') @@ -72,7 +72,7 @@ const ResetPassword = () => { } const onContinue = () => { - navigate(ROUTES_ENUM.account.login) + navigate(ROUTES_ENUM.public.login) } return ( diff --git a/ui/src/views/auth/SendConfirmationCode.tsx b/ui/src/views/auth/SendConfirmationCode.tsx index 3b3b5353..a482cdb9 100644 --- a/ui/src/views/auth/SendConfirmationCode.tsx +++ b/ui/src/views/auth/SendConfirmationCode.tsx @@ -3,7 +3,7 @@ import { Alert, Button, FormContainer, FormItem, Input } from '@/components/ui' import { Field, Form, Formik } from 'formik' import * as Yup from 'yup' import { ActionLink } from '@/components/shared' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { store } from '@/store' import Captcha from '@/components/shared/Captcha' import { useLocalization } from '@/utils/hooks/useLocalization' @@ -85,7 +85,7 @@ const SendConfirmationCode = () => {
{translate('::Abp.Account.Backto')} - {translate('::Abp.Account.SignIn')} + {translate('::Abp.Account.SignIn')}
diff --git a/ui/src/views/auth/Settings/Settings.tsx b/ui/src/views/auth/Settings.tsx similarity index 81% rename from ui/src/views/auth/Settings/Settings.tsx rename to ui/src/views/auth/Settings.tsx index 1c90a434..3020e9b7 100644 --- a/ui/src/views/auth/Settings/Settings.tsx +++ b/ui/src/views/auth/Settings.tsx @@ -1,7 +1,7 @@ import AdaptableCard from '@/components/shared/AdaptableCard' import Container from '@/components/shared/Container' import Tabs from '@/components/ui/Tabs' -import { ROUTES_ENUM } from '@/constants/route.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { useLocalization } from '@/utils/hooks/useLocalization' import { Suspense, lazy, useState } from 'react' import { useLocation, useNavigate } from 'react-router-dom' @@ -21,9 +21,9 @@ type AccountSetting = { }[] } -const Profile = lazy(() => import('./components/Profile')) -const Password = lazy(() => import('./components/Password')) -const NotificationSettings = lazy(() => import('./components/NotificationSettings')) +const General = lazy(() => import('./settings/General')) +const Password = lazy(() => import('./settings/Password')) +const NotificationSettings = lazy(() => import('./settings/NotificationSettings')) const { TabNav, TabList } = Tabs @@ -36,9 +36,9 @@ const Settings = () => { path: string } > = { - profile: { - label: translate('::Abp.Identity.Profile'), - path: 'profile', + general: { + label: translate('::Abp.Identity.Profile.General'), + path: 'general', }, password: { label: translate('::Abp.Identity.Password'), @@ -59,7 +59,7 @@ const Settings = () => { const onTabChange = (val: string) => { if (settingsMenu[val]) { setCurrentTab(settingsMenu[val].path) - navigate(`${ROUTES_ENUM.account.settings}/${settingsMenu[val].path}`) + navigate(`${ROUTES_ENUM.protected.admin.settings}/${settingsMenu[val].path}`) } } @@ -77,7 +77,7 @@ const Settings = () => {
}> - {currentTab === 'profile' && } + {currentTab === 'general' && } {currentTab === 'password' && } {currentTab === 'notification-settings' && } diff --git a/ui/src/views/auth/Settings/index.ts b/ui/src/views/auth/Settings/index.ts deleted file mode 100644 index d04fd354..00000000 --- a/ui/src/views/auth/Settings/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Settings from './Settings' - -export default Settings diff --git a/ui/src/views/auth/Settings/components/Profile.tsx b/ui/src/views/auth/settings/General.tsx similarity index 98% rename from ui/src/views/auth/Settings/components/Profile.tsx rename to ui/src/views/auth/settings/General.tsx index c5345722..1b2b50f5 100644 --- a/ui/src/views/auth/Settings/components/Profile.tsx +++ b/ui/src/views/auth/settings/General.tsx @@ -24,16 +24,16 @@ import 'react-advanced-cropper/dist/style.css' import { BsWhatsapp } from 'react-icons/bs' import { HiMail, HiOutlineTrash, HiOutlineUserCircle, HiPhone, HiPlus } from 'react-icons/hi' import * as Yup from 'yup' -import FormDesription from './FormDesription' -import FormRow from './FormRow' import isEmpty from 'lodash/isEmpty' +import FormRow from '@/views/shared/FormRow' +import FormDesription from '@/views/shared/FormDesription' const schema = Yup.object().shape({ name: Yup.string().min(3).max(50).required(), surname: Yup.string().min(3).max(50).required(), }) -const Profile = () => { +const General = () => { const [loading, setLoading] = useState(true) const [profileData, setProfileData] = useState() const [formData, setFormData] = useState() @@ -303,4 +303,4 @@ const Profile = () => { ) } -export default Profile +export default General diff --git a/ui/src/views/auth/Settings/components/NotificationSettings.tsx b/ui/src/views/auth/settings/NotificationSettings.tsx similarity index 100% rename from ui/src/views/auth/Settings/components/NotificationSettings.tsx rename to ui/src/views/auth/settings/NotificationSettings.tsx diff --git a/ui/src/views/auth/Settings/components/Password.tsx b/ui/src/views/auth/settings/Password.tsx similarity index 98% rename from ui/src/views/auth/Settings/components/Password.tsx rename to ui/src/views/auth/settings/Password.tsx index 9ed2310a..8067bed9 100644 --- a/ui/src/views/auth/Settings/components/Password.tsx +++ b/ui/src/views/auth/settings/Password.tsx @@ -5,6 +5,8 @@ import Notification from '@/components/ui/Notification' import toast from '@/components/ui/toast' import { changePassword } from '@/proxy/account/account.service' import { useLocalization } from '@/utils/hooks/useLocalization' +import FormDesription from '@/views/shared/FormDesription' +import FormRow from '@/views/shared/FormRow' import { Field, Form, Formik } from 'formik' import { HiOutlineDesktopComputer, @@ -12,8 +14,6 @@ import { HiOutlineDeviceTablet, } from 'react-icons/hi' import * as Yup from 'yup' -import FormDesription from './FormDesription' -import FormRow from './FormRow' type LoginHistory = { type: string diff --git a/ui/src/views/shared/DialogContext/DialogShowComponent.tsx b/ui/src/views/shared/DialogContext/DialogShowComponent.tsx index 82253d76..04d48f11 100644 --- a/ui/src/views/shared/DialogContext/DialogShowComponent.tsx +++ b/ui/src/views/shared/DialogContext/DialogShowComponent.tsx @@ -1,9 +1,9 @@ -import RolesPermission from '@/views/admin/identity/Roles/RolesPermission' -import UsersPermission from '@/views/admin/identity/Users/UsersPermission' import TenantsConnectionString from '@/views/admin/tenant-management/TenantsConnectionString' import { useDialogContext } from './DialogProvider' import CreateNotification from '@/views/admin/notification/CreateNotification' import AuditLogDetail from '@/views/admin/auditLog/AuditLogDetail' +import RolesPermission from '@/views/admin/role-management/RolesPermission' +import UsersPermission from '@/views/admin/user-management/UsersPermission' const DialogShowComponent = (): JSX.Element => { const dialogContext: any = useDialogContext() diff --git a/ui/src/views/auth/Settings/components/FormDesription.tsx b/ui/src/views/shared/FormDesription.tsx similarity index 100% rename from ui/src/views/auth/Settings/components/FormDesription.tsx rename to ui/src/views/shared/FormDesription.tsx diff --git a/ui/src/views/auth/Settings/components/FormRow.tsx b/ui/src/views/shared/FormRow.tsx similarity index 100% rename from ui/src/views/auth/Settings/components/FormRow.tsx rename to ui/src/views/shared/FormRow.tsx