From a3e66f5b73af2801453201f911addcf08cc3c758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87elik?= Date: Thu, 2 Oct 2025 17:23:51 +0300 Subject: [PATCH] Restructure Blazor client and add deployment configs Moved Blazor client files to a new 'Blazor.Client' project, updated solution and project references, and removed redundant files from the old Blazor project. Added Docker, Helm, and Kubernetes configuration files for deployment. Updated domain, application, and EF Core projects, including new migrations and localization changes. Enhanced test projects with new test data builders and EntityFrameworkCore tests. --- BookStore-Blazor-EfCore/.editorconfig | 2 + BookStore-Blazor-EfCore/.gitattributes | 2 +- BookStore-Blazor-EfCore/.gitignore | 539 +- BookStore-Blazor-EfCore/.prettierrc | 5 - BookStore-Blazor-EfCore/Acme.BookStore.abpmdl | 136 + BookStore-Blazor-EfCore/Acme.BookStore.abpsln | 186 + BookStore-Blazor-EfCore/Acme.BookStore.sln | 260 +- .../Acme.BookStore.sln.DotSettings | 44 +- BookStore-Blazor-EfCore/NuGet.Config | 17 + BookStore-Blazor-EfCore/README.md | 74 +- .../adb-command-prompt.png | Bin 0 -> 26730 bytes BookStore-Blazor-EfCore/common.props | 38 +- .../abp-studio/k8s-profiles/local.abpk8s.json | 10 + .../run-profiles/Default.abprun.json | 28 + .../etc/docker-compose/README.md | 10 + .../etc/docker-compose/appsettings.json | 18 + .../docker-compose/build-images-locally.ps1 | 33 + .../etc/docker-compose/docker-compose.yml | 88 + .../etc/docker-compose/run-docker.ps1 | 15 + .../etc/docker-compose/run-docker.sh | 14 + .../etc/docker-compose/stop-docker.ps1 | 1 + .../etc/docker-compose/stop-docker.sh | 2 + BookStore-Blazor-EfCore/etc/helm/.gitignore | 1 + BookStore-Blazor-EfCore/etc/helm/README.md | 64 + .../etc/helm/bookstore-local-key.pem | 28 + .../etc/helm/bookstore-local.pem | 27 + .../etc/helm/bookstore/Chart.yaml | 5 + .../helm/bookstore/charts/blazor/Chart.yaml | 6 + .../blazor/templates/blazor-configmap.yaml | 22 + .../blazor/templates/blazor-ingress.yaml | 27 + .../blazor/templates/blazor-service.yaml | 12 + .../charts/blazor/templates/blazor.yaml | 28 + .../helm/bookstore/charts/blazor/values.yaml | 4 + .../bookstore/charts/dbmigrator/Chart.yaml | 6 + .../charts/dbmigrator/templates/migrator.yaml | 43 + .../bookstore/charts/dbmigrator/values.yaml | 6 + .../bookstore/charts/httpapihost/Chart.yaml | 6 + .../templates/httpapihost-ingress.yaml | 27 + .../templates/httpapihost-service.yaml | 12 + .../httpapihost/templates/httpapihost.yaml | 53 + .../bookstore/charts/httpapihost/values.yaml | 4 + .../bookstore/charts/postgresql/Chart.yaml | 5 + .../templates/postgresql-service.yaml | 14 + .../postgresql/templates/postgresql.yaml | 26 + .../bookstore/charts/postgresql/values.yaml | 6 + .../etc/helm/bookstore/templates/_helpers.tpl | 6 + .../bookstore/values.bookstore-local.yaml | 12 + .../etc/helm/bookstore/values.yaml | 4 + .../etc/helm/build-all-images.ps1 | 3 + .../etc/helm/build-image.ps1 | 75 + .../etc/helm/create-tls-secrets.ps1 | 14 + BookStore-Blazor-EfCore/etc/helm/install.ps1 | 23 + .../etc/helm/uninstall.ps1 | 13 + ...cme.BookStore.Application.Contracts.abppkg | 3 + ....Application.Contracts.abppkg.analyze.json | 132 + ...cme.BookStore.Application.Contracts.csproj | 54 +- .../Authors/AuthorDto.cs | 27 +- .../Authors/CreateAuthorDto.cs | 33 +- .../Authors/GetAuthorListDto.cs | 18 +- .../Authors/IAuthorAppService.cs | 38 +- .../Authors/UpdateAuthorDto.cs | 32 +- .../BookStoreApplicationContractsModule.cs | 65 +- .../BookStoreDtoExtensions.cs | 56 +- .../Books/AuthorLookupDto.cs | 19 +- .../Books/BookDto.cs | 39 +- .../Books/CreateUpdateBookDto.cs | 47 +- .../Books/IBookAppService.cs | 33 +- .../BookStorePermissionDefinitionProvider.cs | 67 +- .../Permissions/BookStorePermissions.cs | 54 +- .../Acme.BookStore.Application.abppkg | 3 + ....BookStore.Application.abppkg.analyze.json | 123 + .../Acme.BookStore.Application.csproj | 55 +- .../Authors/AuthorAppService.cs | 183 +- .../BookStoreAppService.cs | 31 +- .../BookStoreApplicationAutoMapperProfile.cs | 35 +- .../BookStoreApplicationModule.cs | 73 +- .../Books/BookAppService.cs | 254 +- .../Properties/AssemblyInfo.cs | 4 +- .../Acme.BookStore.Blazor.Client.abppkg | 3 + .../Acme.BookStore.Blazor.Client.csproj | 45 + .../BookStoreBlazorAutoMapperProfile.cs | 29 +- .../BookStoreBlazorClientModule.cs | 160 + .../BookStoreBrandingProvider.cs | 21 + .../BookStoreComponentBase.cs | 24 +- .../Components/Layout/LeptonXFooter.razor | 22 + .../Navigation/BookStoreMenuContributor.cs | 153 + .../Navigation/BookStoreMenus.cs | 12 + .../Pages/Authors.razor | 354 +- .../Pages/Authors.razor.cs | 341 +- .../Pages/Books.razor | 256 + .../Pages/CookiePolicy.razor | 90 + .../Pages/CookiePolicy.razor.cs | 5 + .../Pages/HostDashboard.razor | 60 + .../Pages/HostDashboard.razor.cs | 92 + .../Pages/Index.razor | 282 + .../Pages/Index.razor.cs | 6 + .../Pages/Index.razor.css | 17 + .../Pages/PrivacyPolicy.razor | 111 + .../Pages/PrivacyPolicy.razor.cs | 5 + .../Pages/TenantDashboard.razor | 49 + .../Pages/TenantDashboard.razor.cs | 76 + .../Acme.BookStore.Blazor.Client/Program.cs | 23 + .../Properties/launchSettings.json | 12 + .../Acme.BookStore.Blazor.Client/Routes.razor | 50 + .../_Imports.razor | 16 + .../wwwroot/appsettings.Development.json | 3 + .../wwwroot/appsettings.json | 18 + .../wwwroot/favicon.ico | Bin 0 -> 38078 bytes .../wwwroot/icon-192.png | Bin 0 -> 2626 bytes .../wwwroot/icon-512.png | Bin 0 -> 6311 bytes .../wwwroot/images/getting-started/bg-01.png | Bin 0 -> 27830 bytes .../wwwroot/images/getting-started/book.png | Bin 0 -> 337312 bytes .../images/getting-started/discord.svg | 7 + .../images/getting-started/img-blog.png | Bin 0 -> 42029 bytes .../images/getting-started/img-community.png | Bin 0 -> 65374 bytes .../images/getting-started/img-support.png | Bin 0 -> 33989 bytes .../images/getting-started/instagram.svg | 23 + .../images/getting-started/stack-overflow.svg | 4 + .../images/getting-started/x-white.svg | 3 + .../images/getting-started/youtube.svg | 11 + .../wwwroot/images/logo/leptonx/icon.svg | 15 + .../wwwroot/images/logo/leptonx/logo-dark.svg | 16 + .../images/logo/leptonx/logo-light.svg | 16 + .../wwwroot/main.css | 42 + .../wwwroot/manifest.json | 21 + .../wwwroot/service-worker.js | 4 + .../wwwroot/service-worker.published.js | 48 + .../Acme.BookStore.Blazor.abppkg | 3 + .../Acme.BookStore.Blazor.csproj | 86 +- .../BookStoreBlazorModule.cs | 336 +- .../BookStoreBrandingProvider.cs | 10 - .../BookStoreScriptBundleContributor.cs | 11 + .../BookStoreStyleBundleContributor.cs | 11 + .../Components/App.razor | 38 + .../src/Acme.BookStore.Blazor/Dockerfile | 5 + .../Acme.BookStore.Blazor/Dockerfile.local | 8 + .../Menus/BookStoreMenuContributor.cs | 60 - .../Menus/BookStoreMenus.cs | 10 - .../Acme.BookStore.Blazor/Pages/Books.razor | 257 - .../Acme.BookStore.Blazor/Pages/Index.razor | 177 - .../Pages/Index.razor.cs | 6 - .../Pages/Index.razor.css | 1 - .../Acme.BookStore.Blazor/Pages/_Host.cshtml | 39 - .../src/Acme.BookStore.Blazor/Program.cs | 107 +- .../Properties/launchSettings.json | 57 +- .../src/Acme.BookStore.Blazor/_Imports.razor | 23 +- .../Acme.BookStore.Blazor/appsettings.json | 16 - .../appsettings.secrets.json | 2 - .../Acme.BookStore.Blazor/package-lock.json | 3196 ----------- .../src/Acme.BookStore.Blazor/package.json | 9 - .../wwwroot/blazor-global-styles.css | 18 - .../Acme.BookStore.Blazor/wwwroot/favicon.ico | Bin 32038 -> 0 bytes .../wwwroot/global-styles.css | 8 - .../logo/leptonx/logo-dark-thumbnail.png | Bin 17592 -> 0 bytes .../wwwroot/images/logo/leptonx/logo-dark.png | Bin 47227 -> 0 bytes .../logo/leptonx/logo-light-thumbnail.png | Bin 13598 -> 0 bytes .../images/logo/leptonx/logo-light.png | Bin 38531 -> 0 bytes .../src/Acme.BookStore.Blazor/yarn.lock | 345 -- .../Acme.BookStore.DbMigrator.abppkg | 1 + .../Acme.BookStore.DbMigrator.csproj | 90 +- .../BookStoreDbMigratorModule.cs | 29 +- .../DbMigratorHostedService.cs | 102 +- .../src/Acme.BookStore.DbMigrator/Dockerfile | 5 + .../Dockerfile.local | 6 + .../src/Acme.BookStore.DbMigrator/Program.cs | 80 +- .../appsettings.json | 46 +- .../appsettings.secrets.json | 5 +- .../Acme.BookStore.Domain.Shared.abppkg | 3 + ...ookStore.Domain.Shared.abppkg.analyze.json | 118 + .../Acme.BookStore.Domain.Shared.csproj | 71 +- .../Authors/AuthorConsts.cs | 13 +- .../BookStoreDomainErrorCodes.cs | 13 +- .../BookStoreDomainSharedModule.cs | 148 +- .../BookStoreGlobalFeatureConfigurator.cs | 42 +- .../BookStoreModuleExtensionConfigurator.cs | 141 +- .../Books/BookType.cs | 28 +- .../Localization/BookStore/ar.json | 50 +- .../Localization/BookStore/cs.json | 48 +- .../Localization/BookStore/de-DE.json | 50 +- .../Localization/BookStore/de.json | 8 - .../Localization/BookStore/en-GB.json | 48 +- .../Localization/BookStore/en.json | 135 +- .../Localization/BookStore/es.json | 50 +- .../Localization/BookStore/fi.json | 50 +- .../Localization/BookStore/fr.json | 50 +- .../Localization/BookStore/hi.json | 50 +- .../Localization/BookStore/hu.json | 50 +- .../Localization/BookStore/is.json | 48 +- .../Localization/BookStore/it.json | 50 +- .../Localization/BookStore/nl.json | 8 - .../Localization/BookStore/pl-PL.json | 8 - .../Localization/BookStore/pt-BR.json | 50 +- .../Localization/BookStore/ro-RO.json | 48 +- .../Localization/BookStore/ru.json | 50 +- .../Localization/BookStore/sk.json | 50 +- .../Localization/BookStore/sl.json | 8 - .../Localization/BookStore/sv.json | 42 + .../Localization/BookStore/tr.json | 59 +- .../Localization/BookStore/vi.json | 8 - .../Localization/BookStore/zh-Hans.json | 50 +- .../Localization/BookStore/zh-Hant.json | 48 +- .../Localization/BookStoreResource.cs | 18 +- .../MultiTenancy/MultiTenancyConsts.cs | 20 +- .../Acme.BookStore.Domain.abppkg | 3 + .../Acme.BookStore.Domain.abppkg.analyze.json | 138 + .../Acme.BookStore.Domain.csproj | 64 +- .../Acme.BookStore.Domain/Authors/Author.cs | 89 +- .../Authors/AuthorAlreadyExistsException.cs | 26 +- .../Authors/AuthorManager.cs | 107 +- .../Authors/IAuthorRepository.cs | 36 +- .../Acme.BookStore.Domain/BookStoreConsts.cs | 19 +- .../BookStoreDataSeederContributor.cs | 150 +- .../BookStoreDomainModule.cs | 127 +- .../src/Acme.BookStore.Domain/Books/Book.cs | 33 +- .../Data/BookStoreDbMigrationService.cs | 445 +- ...BookStoreTenantDatabaseMigrationHandler.cs | 130 + .../Data/IBookStoreDbSchemaMigrator.cs | 16 +- .../Data/NullBookStoreDbSchemaMigrator.cs | 30 +- ...PasswordPolicySettingDefinitionProvider.cs | 34 + .../OpenIddictDataSeedContributor.cs | 780 +-- .../Properties/AssemblyInfo.cs | 6 +- .../Saas/SaasDataSeedContributor.cs | 29 + .../BookStoreSettingDefinitionProvider.cs | 24 +- .../Settings/BookStoreSettings.cs | 18 +- .../Acme.BookStore.EntityFrameworkCore.abppkg | 3 + ...re.EntityFrameworkCore.abppkg.analyze.json | 226 + .../Acme.BookStore.EntityFrameworkCore.csproj | 71 +- .../Authors/EfCoreAuthorRepository.cs | 92 +- .../EntityFrameworkCore/BookStoreDbContext.cs | 238 +- .../BookStoreDbContextFactory.cs | 69 +- .../BookStoreEfCoreEntityExtensionMappings.cs | 88 +- .../BookStoreEntityFrameworkCoreModule.cs | 127 +- ...yFrameworkCoreBookStoreDbSchemaMigrator.cs | 67 +- .../Migrations/20240912065008_Initial.cs | 1227 ----- ....cs => 20251002112612_Initial.Designer.cs} | 4747 ++++++++-------- .../Migrations/20251002112612_Initial.cs | 1505 +++++ ...1002120859_Created_Book_Entity.Designer.cs | 2658 +++++++++ .../20251002120859_Created_Book_Entity.cs | 43 + .../20251002131459_Added_Authors.Designer.cs | 2724 +++++++++ .../20251002131459_Added_Authors.cs | 50 + ...2135800_Added_AuthorId_To_Book.Designer.cs | 2738 +++++++++ .../20251002135800_Added_AuthorId_To_Book.cs | 51 + .../BookStoreDbContextModelSnapshot.cs | 4873 +++++++++-------- .../Properties/AssemblyInfo.cs | 4 +- .../Acme.BookStore.HttpApi.Client.abppkg | 3 + ...okStore.HttpApi.Client.abppkg.analyze.json | 118 + .../Acme.BookStore.HttpApi.Client.csproj | 66 +- .../BookStoreHttpApiClientModule.cs | 87 +- .../Acme.BookStore.HttpApi.Host.abppkg | 4 + .../Acme.BookStore.HttpApi.Host.csproj | 67 + .../BookStoreBrandingProvider.cs | 19 + .../BookStoreHttpApiHostModule.cs | 355 ++ .../Acme.BookStore.HttpApi.Host/Dockerfile | 5 + .../Dockerfile.local | 18 + .../HealthChecks/BookStoreDatabaseCheck.cs | 32 + .../HealthChecksBuilderExtensions.cs | 76 + .../Pages/Index.cshtml | 127 + .../Pages/Index.cshtml.cs | 35 + .../Pages/_ViewImports.cshtml | 6 +- .../Acme.BookStore.HttpApi.Host/Program.cs | 63 + .../Properties/launchSettings.json | 27 + .../abp.resourcemapping.js | 22 +- .../appsettings.Development.json | 4 +- .../appsettings.json | 26 + .../appsettings.secrets.json | 3 + .../Acme.BookStore.HttpApi.Host/package.json | 9 + .../web.config | 36 +- .../wwwroot/global-scripts.js | 1 + .../wwwroot/global-styles.css | 10 + .../wwwroot/images/clients/angular.svg | 1 + .../wwwroot/images/clients/aspnetcore.svg | 1 + .../wwwroot/images/clients/blazor.svg | 1 + .../wwwroot/images/clients/swagger.svg | 8 + .../wwwroot/images/logo/leptonx/icon.svg | 15 + .../wwwroot/images/logo/leptonx/logo-dark.svg | 16 + .../images/logo/leptonx/logo-light.svg | 16 + .../src/Acme.BookStore.HttpApi.Host/yarn.lock | 1043 ++++ .../Acme.BookStore.HttpApi.abppkg | 3 + ...Acme.BookStore.HttpApi.abppkg.analyze.json | 118 + .../Acme.BookStore.HttpApi.csproj | 56 +- .../BookStoreHttpApiModule.cs | 93 +- .../Controllers/BookStoreController.cs | 28 +- .../Models/Test/TestModel.cs | 20 +- .../Acme.BookStore.Application.Tests.abppkg | 3 + .../Acme.BookStore.Application.Tests.csproj | 39 +- .../Authors/AuthorAppService_Tests.cs | 143 +- .../BookStoreApplicationTestBase.cs | 15 +- .../BookStoreApplicationTestModule.cs | 24 +- .../Books/BookAppService_Tests.cs | 160 +- .../Samples/SampleAppServiceTests.cs | 66 +- .../Acme.BookStore.Domain.Tests.abppkg | 3 + .../Acme.BookStore.Domain.Tests.csproj | 38 +- .../BookStoreDomainTestBase.cs | 16 +- .../BookStoreDomainTestModule.cs | 24 +- .../Samples/SampleDomainTests.cs | 90 +- ...BookStore.EntityFrameworkCore.Tests.abppkg | 3 + ...BookStore.EntityFrameworkCore.Tests.csproj | 41 +- .../Authors/EfCoreAuthorAppService_Tests.cs | 10 + .../Books/EfCoreBookAppService_Tests.cs | 10 + .../EfCoreSampleAppServiceTests.cs | 10 + .../BookStoreEntityFrameworkCoreCollection.cs | 9 + ...ntityFrameworkCoreCollectionFixtureBase.cs | 9 + .../BookStoreEntityFrameworkCoreFixture.cs | 11 + .../BookStoreEntityFrameworkCoreTestBase.cs | 16 +- .../BookStoreEntityFrameworkCoreTestModule.cs | 144 +- .../Domains/EfCoreSampleDomainTests.cs | 10 + .../Samples/SampleRepositoryTests.cs | 83 +- ...Store.HttpApi.Client.ConsoleTestApp.abppkg | 3 + ...Store.HttpApi.Client.ConsoleTestApp.csproj | 74 +- .../BookStoreConsoleApiClientModule.cs | 60 +- .../ClientDemoService.cs | 63 +- .../ConsoleTestAppHostedService.cs | 40 - .../Program.cs | 55 +- .../appsettings.json | 34 +- .../appsettings.secrets.json | 5 +- .../Acme.BookStore.TestBase.abppkg | 3 + .../Acme.BookStore.TestBase.csproj | 75 +- .../BookStoreTestBase.cs | 127 +- .../BookStoreTestBaseModule.cs | 105 +- .../BookStoreTestConsts.cs | 6 + .../BookStoreTestDataBuilder.cs | 26 + .../BookStoreTestDataSeedContributor.cs | 15 - .../Security/FakeCurrentPrincipalAccessor.cs | 68 +- .../Acme.BookStore.TestBase/appsettings.json | 3 + .../appsettings.secrets.json | 3 + 325 files changed, 26918 insertions(+), 14428 deletions(-) create mode 100644 BookStore-Blazor-EfCore/.editorconfig delete mode 100644 BookStore-Blazor-EfCore/.prettierrc create mode 100644 BookStore-Blazor-EfCore/Acme.BookStore.abpmdl create mode 100644 BookStore-Blazor-EfCore/Acme.BookStore.abpsln create mode 100644 BookStore-Blazor-EfCore/NuGet.Config create mode 100644 BookStore-Blazor-EfCore/adb-command-prompt.png create mode 100644 BookStore-Blazor-EfCore/etc/abp-studio/k8s-profiles/local.abpk8s.json create mode 100644 BookStore-Blazor-EfCore/etc/abp-studio/run-profiles/Default.abprun.json create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/README.md create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/appsettings.json create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/build-images-locally.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/docker-compose.yml create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/run-docker.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/run-docker.sh create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.sh create mode 100644 BookStore-Blazor-EfCore/etc/helm/.gitignore create mode 100644 BookStore-Blazor-EfCore/etc/helm/README.md create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore-local-key.pem create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore-local.pem create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/Chart.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/Chart.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-configmap.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-ingress.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-service.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/values.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/Chart.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/templates/migrator.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/values.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/Chart.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-ingress.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-service.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/values.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/Chart.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql-service.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/values.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/templates/_helpers.tpl create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/values.bookstore-local.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/bookstore/values.yaml create mode 100644 BookStore-Blazor-EfCore/etc/helm/build-all-images.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/helm/build-image.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/helm/create-tls-secrets.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/helm/install.ps1 create mode 100644 BookStore-Blazor-EfCore/etc/helm/uninstall.ps1 create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg.analyze.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg.analyze.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.csproj rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.Blazor.Client}/BookStoreBlazorAutoMapperProfile.cs (62%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorClientModule.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBrandingProvider.cs rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.Blazor.Client}/BookStoreComponentBase.cs (83%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Components/Layout/LeptonXFooter.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenuContributor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenus.cs rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.Blazor.Client}/Pages/Authors.razor (97%) rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.Blazor.Client}/Pages/Authors.razor.cs (94%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Books.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.css create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Program.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Properties/launchSettings.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Routes.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/_Imports.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.Development.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/favicon.ico create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/icon-192.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/icon-512.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/bg-01.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/book.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/discord.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-blog.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-community.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-support.png create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/instagram.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/x-white.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/youtube.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/icon.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-dark.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-light.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/main.css create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/manifest.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.js create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.published.js create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.abppkg delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBrandingProvider.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreScriptBundleContributor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreStyleBundleContributor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Components/App.razor create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile.local delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenuContributor.cs delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenus.cs delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Books.razor delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.cs delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.css delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_Host.cshtml delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.secrets.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package-lock.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/blazor-global-styles.css delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/favicon.ico delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/global-styles.css delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/images/logo/leptonx/logo-dark-thumbnail.png delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/images/logo/leptonx/logo-dark.png delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/images/logo/leptonx/logo-light-thumbnail.png delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/images/logo/leptonx/logo-light.png delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/yarn.lock create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile.local create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg.analyze.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/nl.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pl-PL.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sl.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sv.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/vi.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg.analyze.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreTenantDatabaseMigrationHandler.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Identity/ChangeIdentityPasswordPolicySettingDefinitionProvider.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Saas/SaasDataSeedContributor.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg.analyze.json delete mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.cs rename BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/{20240912065008_Initial.Designer.cs => 20251002112612_Initial.Designer.cs} (57%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.Designer.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.Designer.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.Designer.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg.analyze.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreBrandingProvider.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile.local create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/BookStoreDatabaseCheck.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/HealthChecksBuilderExtensions.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml.cs rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.HttpApi.Host}/Pages/_ViewImports.cshtml (98%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Program.cs create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Properties/launchSettings.json rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.HttpApi.Host}/abp.resourcemapping.js (89%) rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.HttpApi.Host}/appsettings.Development.json (66%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.secrets.json create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/package.json rename BookStore-Blazor-EfCore/src/{Acme.BookStore.Blazor => Acme.BookStore.HttpApi.Host}/web.config (82%) create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-scripts.js create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-styles.css create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/angular.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/aspnetcore.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/blazor.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/swagger.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/icon.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-light.svg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/yarn.lock create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg create mode 100644 BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg.analyze.json create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.abppkg create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.abppkg create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.abppkg create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Authors/EfCoreAuthorAppService_Tests.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Books/EfCoreBookAppService_Tests.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollection.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollectionFixtureBase.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreFixture.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.abppkg delete mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.abppkg create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestConsts.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataBuilder.cs delete mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.json create mode 100644 BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.secrets.json diff --git a/BookStore-Blazor-EfCore/.editorconfig b/BookStore-Blazor-EfCore/.editorconfig new file mode 100644 index 0000000000..790204da68 --- /dev/null +++ b/BookStore-Blazor-EfCore/.editorconfig @@ -0,0 +1,2 @@ +[*.csproj] +indent_size = 2 \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/.gitattributes b/BookStore-Blazor-EfCore/.gitattributes index c941e52669..81f6475089 100644 --- a/BookStore-Blazor-EfCore/.gitattributes +++ b/BookStore-Blazor-EfCore/.gitattributes @@ -1 +1 @@ -**/wwwroot/libs/** linguist-vendored +**/wwwroot/libs/** linguist-vendored diff --git a/BookStore-Blazor-EfCore/.gitignore b/BookStore-Blazor-EfCore/.gitignore index 82fe6a97d4..6f0b10dc50 100644 --- a/BookStore-Blazor-EfCore/.gitignore +++ b/BookStore-Blazor-EfCore/.gitignore @@ -1,265 +1,274 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# DNX -project.lock.json -artifacts/ - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignoreable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.pfx -*.publishsettings -node_modules/ -orleans.codegen.cs - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# BookStore -src/Acme.BookStore.Web/Logs/* -src/Acme.BookStore.Web.Host/Logs/* -src/Acme.BookStore.AuthServer/Logs/* -src/Acme.BookStore.HttpApi.Host/Logs/* -src/Acme.BookStore.HttpApi.HostWithIds/Logs/* -src/Acme.BookStore.DbMigrator/Logs/* -src/Acme.BookStore.Blazor/Logs/* -src/Acme.BookStore.Blazor.Tiered/Logs/* - -# Use abp install-libs to restore. -**/wwwroot/libs/* +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +**/.idea/ +*.sln.iml + +# ABP Studio +**/.abpstudio/ + +# BookStore +src/Acme.BookStore.Web/Logs/* +src/Acme.BookStore.Web.Host/Logs/* +src/Acme.BookStore.Web.Public/Logs/* +src/Acme.BookStore.Web.Public.Host/Logs/* +src/Acme.BookStore.AuthServer/Logs/* +src/Acme.BookStore.HttpApi.Host/Logs/* +src/Acme.BookStore.HttpApi.Host/Logs/* +src/Acme.BookStore.DbMigrator/Logs/* +src/Acme.BookStore.Blazor.Server/Logs/* +src/Acme.BookStore.Blazor.Server.Tiered/Logs/* + +# Use abp install-libs to restore. +**/wwwroot/libs/* + +# IdentityServer temp files +tempkey.rsa +tempkey.jwk \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/.prettierrc b/BookStore-Blazor-EfCore/.prettierrc deleted file mode 100644 index 56af76bd94..0000000000 --- a/BookStore-Blazor-EfCore/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singleQuote": true, - "useTabs": false, - "tabWidth": 4 -} diff --git a/BookStore-Blazor-EfCore/Acme.BookStore.abpmdl b/BookStore-Blazor-EfCore/Acme.BookStore.abpmdl new file mode 100644 index 0000000000..13adb41e37 --- /dev/null +++ b/BookStore-Blazor-EfCore/Acme.BookStore.abpmdl @@ -0,0 +1,136 @@ +{ + "template": "app", + "imports": { + "Volo.Abp.LeptonXTheme": { + "version": "4.3.4", + "isInstalled": true + }, + "Volo.Abp.TextTemplateManagement": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.LanguageManagement": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.OpenIddict.Pro": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.Gdpr": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.AuditLogging.Pro": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Saas": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.Identity.Pro": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.Account.Pro": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.SettingManagement": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.PermissionManagement": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + }, + "Volo.Abp.FeatureManagement": { + "version": "9.3.4", + "isInstalled": true, + "creationTime": "10/02/2025 11:25:55 +00:00" + } + }, + "folders": { + "items": { + "src": {}, + "test": {} + } + }, + "packages": { + "Acme.BookStore.Application": { + "path": "src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg", + "folder": "src" + }, + "Acme.BookStore.Application.Tests": { + "path": "test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.abppkg", + "folder": "test" + }, + "Acme.BookStore.Domain.Shared": { + "path": "src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg", + "folder": "src" + }, + "Acme.BookStore.Application.Contracts": { + "path": "src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg", + "folder": "src" + }, + "Acme.BookStore.HttpApi": { + "path": "src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg", + "folder": "src" + }, + "Acme.BookStore.HttpApi.Client": { + "path": "src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg", + "folder": "src" + }, + "Acme.BookStore.EntityFrameworkCore.Tests": { + "path": "test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.abppkg", + "folder": "test" + }, + "Acme.BookStore.EntityFrameworkCore": { + "path": "src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg", + "folder": "src" + }, + "Acme.BookStore.TestBase": { + "path": "test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.abppkg", + "folder": "test" + }, + "Acme.BookStore.Domain.Tests": { + "path": "test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.abppkg", + "folder": "test" + }, + "Acme.BookStore.HttpApi.Client.ConsoleTestApp": { + "path": "test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.abppkg", + "folder": "test" + }, + "Acme.BookStore.DbMigrator": { + "path": "src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.abppkg", + "folder": "src" + }, + "Acme.BookStore.HttpApi.Host": { + "path": "src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.abppkg", + "folder": "src" + }, + "Acme.BookStore.Blazor": { + "path": "src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.abppkg", + "folder": "src" + }, + "Acme.BookStore.Blazor.Client": { + "path": "src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.abppkg", + "folder": "src" + }, + "Acme.BookStore.Domain": { + "path": "src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg", + "folder": "src" + } + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/Acme.BookStore.abpsln b/BookStore-Blazor-EfCore/Acme.BookStore.abpsln new file mode 100644 index 0000000000..f35be92835 --- /dev/null +++ b/BookStore-Blazor-EfCore/Acme.BookStore.abpsln @@ -0,0 +1,186 @@ +{ + "id": "1e289a56-fcfa-4a96-842d-fe628fd079b9", + "creationTime": "10/02/2025 11:25:55 +00:00", + "template": "app", + "versions": { + "LeptonX": "4.3.4", + "AbpFramework": "9.3.4", + "AbpCommercial": "9.3.4", + "AbpStudio": "1.3.2", + "TargetDotnetFramework": "net9.0" + }, + "modules": { + "Acme.BookStore": { + "path": "Acme.BookStore.abpmdl" + } + }, + "runProfiles": { + "Default": { + "path": "etc/abp-studio/run-profiles/Default.abprun.json" + } + }, + "k8sProfiles": { + "local": { + "path": "etc/abp-studio/k8s-profiles/local.abpk8s.json" + } + }, + "commands": { + "helmBuildDotnetImage": { + "triggerTargets": [ + "HELM_CHARTS_ROOT", + "HELM_MAIN_CHART", + "HELM_SUB_CHART" + ], + "executionTargets": [ + "HELM_MAIN_CHART", + "HELM_SUB_CHART" + ], + "displayName": "Build Docker Image(s)", + "workingDirectory": "etc/helm", + "terminalCommand": "./build-image.ps1 -ProjectPath {{metadata.projectPath}} -ImageName {{metadata.imageName}} -ProjectType {{metadata.projectType}}", + "condition": "{{metadata.projectPath != null && metadata.imageName != null && metadata.projectType != null}}" + }, + "helmInstallChart": { + "triggerTargets": [ + "HELM_CHARTS_ROOT", + "HELM_MAIN_CHART" + ], + "executionTargets": [ + "HELM_MAIN_CHART" + ], + "displayName": "Install Chart(s)", + "workingDirectory": "etc/helm", + "terminalCommand": "./install.ps1 -ChartName {{chart.name}} -Namespace {{profile.namespace}} -ReleaseName {{chart.name}}-{{profile.name}} -DotnetEnvironment {{metadata.dotnetEnvironment}} {{~if metadata.k8ssuffix}} -User {{metadata.k8ssuffix}}{{end}}", + "requireConfirmation": "true", + "confirmationText": "Are you sure to install the chart(s) for the profile {{ profile.name }}?" + }, + "helmUninstallChart": { + "triggerTargets": [ + "HELM_CHARTS_ROOT", + "HELM_MAIN_CHART" + ], + "executionTargets": [ + "HELM_MAIN_CHART" + ], + "displayName": "Uninstall Chart(s)", + "workingDirectory": "etc/helm", + "terminalCommand": "./uninstall.ps1 -Namespace {{profile.namespace}} -ReleaseName {{chart.name}}-{{profile.name}} {{~if metadata.k8ssuffix}} -User {{metadata.k8ssuffix}}{{end}}", + "requireConfirmation": "true", + "confirmationText": "Are you sure to uninstall the chart(s) for the profile {{profile.name}}?" + }, + "kubernetesRedeploy": { + "triggerTargets": [ + "KUBERNETES_SERVICE" + ], + "executionTargets": [ + "KUBERNETES_SERVICE" + ], + "displayName": "Redeploy", + "workingDirectory": "etc/helm", + "terminalCommand": "./build-image.ps1 -ProjectPath {{chart.metadata.projectPath}} -ImageName {{chart.metadata.imageName}} -ProjectType {{chart.metadata.projectType}} &&& ./install.ps1 -ChartName {{mainChart.name}} -Namespace {{profile.namespace}} -ReleaseName {{mainChart.name}}-{{profile.name}} -DotnetEnvironment {{mainChart.metadata.dotnetEnvironment}} {{~if metadata.k8ssuffix}} -User {{metadata.k8ssuffix}}{{end}}", + "requireConfirmation": "true", + "confirmationText": "Are you sure to redeploy the related chart '{{chart.name}}' for the service '{{name}}'?", + "condition": "{{chart != null && chart.metadata.projectPath != null && chart.metadata.imageName != null && chart.metadata.projectType != null}}" + }, + "createTlsSecret": { + "triggerTargets": [ + "HELM_CHARTS_ROOT" + ], + "executionTargets": [ + "HELM_CHARTS_ROOT" + ], + "displayName": "Create Self-Signed TLS secret", + "workingDirectory": "etc/helm", + "terminalCommand": "./create-tls-secrets.ps1 -Namespace {{profile.namespace}} {{~if metadata.k8ssuffix}} -User {{metadata.k8ssuffix}}{{end}}" + } + }, + "helm": { + "charts": { + "bookstore": { + "name": "bookstore", + "path": "etc/helm/bookstore", + "charts": { + "blazor": { + "name": "blazor", + "path": "etc/helm/bookstore/charts/blazor", + "metadata": { + "projectPath": "../../src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj", + "imageName": "bookstore/blazor", + "projectType": "dotnet" + }, + "services": [ + ".*-blazor" + ] + }, + "dbmigrator": { + "name": "dbmigrator", + "path": "etc/helm/bookstore/charts/dbmigrator", + "metadata": { + "projectPath": "../../src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj", + "imageName": "bookstore/dbmigrator", + "projectType": "dotnet" + }, + "services": [ + ".*-dbmigrator" + ] + }, + "httpapihost": { + "name": "httpapihost", + "path": "etc/helm/bookstore/charts/httpapihost", + "metadata": { + "projectPath": "../../src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj", + "imageName": "bookstore/httpapihost", + "projectType": "dotnet" + }, + "services": [ + ".*-httpapihost" + ] + }, + "postgresql": { + "name": "postgresql", + "path": "etc/helm/bookstore/charts/postgresql" + }, + }, + "metadata": {} + } + } + }, + "options": { + "httpRequests": { + "ignoredUrls": [ + + ] + } + }, + "creatingStudioConfiguration": { + "template": "app", + "createdAbpStudioVersion": "1.3.2", + "tiered": "false", + "runInstallLibs": "true", + "runBundling": "false", + "useLocalReferences": "false", + "multiTenancy": "true", + "includeTests": "true", + "kubernetesConfiguration": "true", + "uiFramework": "blazor", + "mobileFramework": "none", + "distributedEventBus": "none", + "databaseProvider": "ef", + "runDbMigrator": "true", + "databaseManagementSystem": "postgresql", + "separateTenantSchema": "false", + "createInitialMigration": "true", + "theme": "leptonx", + "themeStyle": "system", + "themeMenuPlacement": "side", + "mobileFramework": "none", + "progressiveWebApp": "false", + "runProgressiveWebAppSupport": "false", + "publicWebsite": "false", + "optionalModules": "GDPR TextTemplateManagement LanguageManagement AuditLogging OpenIddictAdmin", + "socialLogin": "true", + "selectedLanguages": ["English", "Arabic", "Chinese (Simplified)", "Chinese (Traditional)", "Czech", "English (United Kingdom)", "Finnish", "French", "German (Germany)", "Hindi ", "Hungarian", "Icelandic", "Italian", "Portuguese (Brazil)", "Romanian (Romania)", "Russian", "Slovak", "Spanish", "Swedish", "Turkish", ], + "defaultLanguage": "English", + "createCommand": "abp new Acme.BookStore -t app --ui-framework blazor --database-provider ef --database-management-system postgresql --theme leptonx --without-cms-kit --dont-run-bundling -no-file-management" + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/Acme.BookStore.sln b/BookStore-Blazor-EfCore/Acme.BookStore.sln index acd51d031e..7ca0c68d8a 100644 --- a/BookStore-Blazor-EfCore/Acme.BookStore.sln +++ b/BookStore-Blazor-EfCore/Acme.BookStore.sln @@ -1,123 +1,137 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.33209.295 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain", "src\Acme.BookStore.Domain\Acme.BookStore.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application", "src\Acme.BookStore.Application\Acme.BookStore.Application.csproj", "{1A94A50E-06DC-43C1-80B5-B662820EC3EB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.EntityFrameworkCore", "src\Acme.BookStore.EntityFrameworkCore\Acme.BookStore.EntityFrameworkCore.csproj", "{C956DD76-69C8-4A9C-83EA-D17DF83340FD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CA9AC87F-097E-4F15-8393-4BC07735A5B0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{04DBDB01-70F4-4E06-B468-8F87850B22BE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application.Tests", "test\Acme.BookStore.Application.Tests\Acme.BookStore.Application.Tests.csproj", "{50B2631D-129C-47B3-A587-029CCD6099BC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain.Shared", "src\Acme.BookStore.Domain.Shared\Acme.BookStore.Domain.Shared.csproj", "{42F719ED-8413-4895-B5B4-5AB56079BC66}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application.Contracts", "src\Acme.BookStore.Application.Contracts\Acme.BookStore.Application.Contracts.csproj", "{520659C8-C734-4298-A3DA-B539DB9DFC0B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi", "src\Acme.BookStore.HttpApi\Acme.BookStore.HttpApi.csproj", "{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi.Client", "src\Acme.BookStore.HttpApi.Client\Acme.BookStore.HttpApi.Client.csproj", "{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.EntityFrameworkCore.Tests", "test\Acme.BookStore.EntityFrameworkCore.Tests\Acme.BookStore.EntityFrameworkCore.Tests.csproj", "{1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.TestBase", "test\Acme.BookStore.TestBase\Acme.BookStore.TestBase.csproj", "{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain.Tests", "test\Acme.BookStore.Domain.Tests\Acme.BookStore.Domain.Tests.csproj", "{E512F4D9-9375-480F-A2F6-A46509F9D824}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi.Client.ConsoleTestApp", "test\Acme.BookStore.HttpApi.Client.ConsoleTestApp\Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj", "{EF480016-9127-4916-8735-D2466BDBC582}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.DbMigrator", "src\Acme.BookStore.DbMigrator\Acme.BookStore.DbMigrator.csproj", "{AA94D832-1CCC-4715-95A9-A483F23A1A5D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Blazor", "src\Acme.BookStore.Blazor\Acme.BookStore.Blazor.csproj", "{16F0BF4E-7D73-4278-8D9A-7CDE37105C6B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.Build.0 = Release|Any CPU - {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.Build.0 = Release|Any CPU - {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.Build.0 = Release|Any CPU - {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.Build.0 = Release|Any CPU - {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.Build.0 = Release|Any CPU - {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.Build.0 = Release|Any CPU - {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.Build.0 = Release|Any CPU - {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.Build.0 = Release|Any CPU - {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.Build.0 = Release|Any CPU - {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.Build.0 = Release|Any CPU - {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.Build.0 = Release|Any CPU - {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.Build.0 = Release|Any CPU - {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Release|Any CPU.Build.0 = Release|Any CPU - {16F0BF4E-7D73-4278-8D9A-7CDE37105C6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16F0BF4E-7D73-4278-8D9A-7CDE37105C6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16F0BF4E-7D73-4278-8D9A-7CDE37105C6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16F0BF4E-7D73-4278-8D9A-7CDE37105C6B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {554AD327-6DBA-4F8F-96F8-81CE7A0C863F} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {1A94A50E-06DC-43C1-80B5-B662820EC3EB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {C956DD76-69C8-4A9C-83EA-D17DF83340FD} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} - {42F719ED-8413-4895-B5B4-5AB56079BC66} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {520659C8-C734-4298-A3DA-B539DB9DFC0B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {4164BDF7-F527-4E85-9CE6-E3C2D7426A27} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {3B5A0094-670D-4BB1-BFDD-61B88A8773DC} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} - {91853F21-9CD9-4132-BC29-A7D5D84FFFE7} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} - {E512F4D9-9375-480F-A2F6-A46509F9D824} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} - {EF480016-9127-4916-8735-D2466BDBC582} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} - {AA94D832-1CCC-4715-95A9-A483F23A1A5D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - {16F0BF4E-7D73-4278-8D9A-7CDE37105C6B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6AAFA1C6-603E-13FA-45E5-7910AA9F661D} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32611.2 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain", "src\Acme.BookStore.Domain\Acme.BookStore.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application", "src\Acme.BookStore.Application\Acme.BookStore.Application.csproj", "{1A94A50E-06DC-43C1-80B5-B662820EC3EB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.EntityFrameworkCore", "src\Acme.BookStore.EntityFrameworkCore\Acme.BookStore.EntityFrameworkCore.csproj", "{C956DD76-69C8-4A9C-83EA-D17DF83340FD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CA9AC87F-097E-4F15-8393-4BC07735A5B0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{04DBDB01-70F4-4E06-B468-8F87850B22BE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application.Tests", "test\Acme.BookStore.Application.Tests\Acme.BookStore.Application.Tests.csproj", "{50B2631D-129C-47B3-A587-029CCD6099BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain.Shared", "src\Acme.BookStore.Domain.Shared\Acme.BookStore.Domain.Shared.csproj", "{42F719ED-8413-4895-B5B4-5AB56079BC66}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application.Contracts", "src\Acme.BookStore.Application.Contracts\Acme.BookStore.Application.Contracts.csproj", "{520659C8-C734-4298-A3DA-B539DB9DFC0B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi", "src\Acme.BookStore.HttpApi\Acme.BookStore.HttpApi.csproj", "{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi.Client", "src\Acme.BookStore.HttpApi.Client\Acme.BookStore.HttpApi.Client.csproj", "{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.EntityFrameworkCore.Tests", "test\Acme.BookStore.EntityFrameworkCore.Tests\Acme.BookStore.EntityFrameworkCore.Tests.csproj", "{1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.TestBase", "test\Acme.BookStore.TestBase\Acme.BookStore.TestBase.csproj", "{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain.Tests", "test\Acme.BookStore.Domain.Tests\Acme.BookStore.Domain.Tests.csproj", "{E512F4D9-9375-480F-A2F6-A46509F9D824}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi.Client.ConsoleTestApp", "test\Acme.BookStore.HttpApi.Client.ConsoleTestApp\Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj", "{EF480016-9127-4916-8735-D2466BDBC582}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.DbMigrator", "src\Acme.BookStore.DbMigrator\Acme.BookStore.DbMigrator.csproj", "{70680696-BB1E-4383-BCB2-42C3767171FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.HttpApi.Host", "src\Acme.BookStore.HttpApi.Host\Acme.BookStore.HttpApi.Host.csproj", "{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Blazor", "src\Acme.BookStore.Blazor\Acme.BookStore.Blazor.csproj", "{2DC842B5-1705-4097-AD37-E889C1B97950}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Blazor.Client", "src\Acme.BookStore.Blazor.Client\Acme.BookStore.Blazor.Client.csproj", "{9DF63919-581A-488B-BFE3-0622A500A56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.Build.0 = Release|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.Build.0 = Release|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.Build.0 = Release|Any CPU + {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.Build.0 = Release|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.Build.0 = Release|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.Build.0 = Release|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.Build.0 = Release|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.Build.0 = Release|Any CPU + {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.Build.0 = Release|Any CPU + {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.Build.0 = Release|Any CPU + {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.Build.0 = Release|Any CPU + {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.Build.0 = Release|Any CPU + {70680696-BB1E-4383-BCB2-42C3767171FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70680696-BB1E-4383-BCB2-42C3767171FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70680696-BB1E-4383-BCB2-42C3767171FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70680696-BB1E-4383-BCB2-42C3767171FB}.Release|Any CPU.Build.0 = Release|Any CPU + {96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Release|Any CPU.Build.0 = Release|Any CPU + {2DC842B5-1705-4097-AD37-E889C1B97950}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DC842B5-1705-4097-AD37-E889C1B97950}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DC842B5-1705-4097-AD37-E889C1B97950}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DC842B5-1705-4097-AD37-E889C1B97950}.Release|Any CPU.Build.0 = Release|Any CPU + {9DF63919-581A-488B-BFE3-0622A500A56C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DF63919-581A-488B-BFE3-0622A500A56C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DF63919-581A-488B-BFE3-0622A500A56C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DF63919-581A-488B-BFE3-0622A500A56C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {1A94A50E-06DC-43C1-80B5-B662820EC3EB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {C956DD76-69C8-4A9C-83EA-D17DF83340FD} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} + {42F719ED-8413-4895-B5B4-5AB56079BC66} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {520659C8-C734-4298-A3DA-B539DB9DFC0B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} + {91853F21-9CD9-4132-BC29-A7D5D84FFFE7} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} + {E512F4D9-9375-480F-A2F6-A46509F9D824} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} + {EF480016-9127-4916-8735-D2466BDBC582} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} + {70680696-BB1E-4383-BCB2-42C3767171FB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {2DC842B5-1705-4097-AD37-E889C1B97950} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {9DF63919-581A-488B-BFE3-0622A500A56C} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} + EndGlobalSection +EndGlobal diff --git a/BookStore-Blazor-EfCore/Acme.BookStore.sln.DotSettings b/BookStore-Blazor-EfCore/Acme.BookStore.sln.DotSettings index cb0b2c919f..78318165e7 100644 --- a/BookStore-Blazor-EfCore/Acme.BookStore.sln.DotSettings +++ b/BookStore-Blazor-EfCore/Acme.BookStore.sln.DotSettings @@ -1,23 +1,23 @@ - - True - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - Required - Required - Required - Required - False - True - False - False - True - False - False - SQL + + True + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + Required + Required + Required + Required + False + True + False + False + True + False + False + SQL \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/NuGet.Config b/BookStore-Blazor-EfCore/NuGet.Config new file mode 100644 index 0000000000..4718b2cf5b --- /dev/null +++ b/BookStore-Blazor-EfCore/NuGet.Config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/README.md b/BookStore-Blazor-EfCore/README.md index 2ec99fe261..43fdaee5f6 100644 --- a/BookStore-Blazor-EfCore/README.md +++ b/BookStore-Blazor-EfCore/README.md @@ -1,5 +1,69 @@ -# Web Application Development Tutorial - -This is an example project for the Web Application Development Tutorial documentation. See the documentation: - -**https://abp.io/docs/latest/Tutorials/Part-1?UI=Blazor&DB=EF** \ No newline at end of file +# Acme.BookStore + +## About this solution + +This is a layered startup solution based on [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) practises. All the fundamental ABP modules are already installed. Check the [Application Startup Template](https://abp.io/docs/latest/solution-templates/layered-web-application) documentation for more info. + +### Pre-requirements + +* [.NET9.0+ SDK](https://dotnet.microsoft.com/download/dotnet) +* [Node v18 or 20](https://nodejs.org/en) + +### Configurations + +The solution comes with a default configuration that works out of the box. However, you may consider to change the following configuration before running your solution: + +* Check the `ConnectionStrings` in `appsettings.json` files under the `Acme.BookStore.HttpApi.Host` and `Acme.BookStore.DbMigrator` projects and change it if you need. + +### Before running the application + +* Run `abp install-libs` command on your solution folder to install client-side package dependencies. This step is automatically done when you create a new solution, if you didn't especially disabled it. However, you should run it yourself if you have first cloned this solution from your source control, or added a new client-side package dependency to your solution. +* Run `Acme.BookStore.DbMigrator` to create the initial database. This step is also automatically done when you create a new solution, if you didn't especially disabled it. This should be done in the first run. It is also needed if a new database migration is added to the solution later. + +#### Generating a Signing Certificate + +In the production environment, you need to use a production signing certificate. ABP Framework sets up signing and encryption certificates in your application and expects an `openiddict.pfx` file in your application. + +To generate a signing certificate, you can use the following command: + +```bash +dotnet dev-certs https -v -ep openiddict.pfx -p 2fbe0669-7a6d-4e08-9f1f-d4d906b6a6c3 +``` + +> `2fbe0669-7a6d-4e08-9f1f-d4d906b6a6c3` is the password of the certificate, you can change it to any password you want. + +It is recommended to use **two** RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. + +For more information, please refer to: [OpenIddict Certificate Configuration](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios) + +> Also, see the [Configuring OpenIddict](https://abp.io/docs/latest/Deployment/Configuring-OpenIddict#production-environment) documentation for more information. + +### Solution structure + +This is a layered monolith application that consists of the following applications: + +* `Acme.BookStore.DbMigrator`: A console application which applies the migrations and also seeds the initial data. It is useful on development as well as on production environment. +* `Acme.BookStore.HttpApi.Host`: ASP.NET Core API application that is used to expose the APIs to the clients. +* `Acme.BookStore.Blazor`: ASP.NET Core Blazor WASM application that is a single page application that runs on the browser. + + +## Deploying the application + +Deploying an ABP application follows the same process as deploying any .NET or ASP.NET Core application. However, there are important considerations to keep in mind. For detailed guidance, refer to ABP's [deployment documentation](https://abp.io/docs/latest/Deployment/Index). + +### Additional resources + + +#### Internal Resources + +You can find detailed setup and configuration guide(s) for your solution below: + +* [Local Kubernetes Guide](./etc/helm/README.md) + +#### External Resources +You can see the following resources to learn more about your solution and the ABP Framework: + +* [Web Application Development Tutorial](https://abp.io/docs/latest/tutorials/book-store/part-1) +* [Application Startup Template](https://abp.io/docs/latest/startup-templates/application/index) +* [LeptonX Theme Module](https://abp.io/docs/latest/themes/lepton-x/index) +* [LeptonX Blazor UI](https://abp.io/docs/latest/themes/lepton-x/blazor?UI=Blazor) diff --git a/BookStore-Blazor-EfCore/adb-command-prompt.png b/BookStore-Blazor-EfCore/adb-command-prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1ca8ef188de36422e918eea6985e0ab2dc8e0f GIT binary patch literal 26730 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 a)LTA#njK}5PeFgz=iq*Q%_5ECSN;obdQ@5f literal 0 HcmV?d00001 diff --git a/BookStore-Blazor-EfCore/common.props b/BookStore-Blazor-EfCore/common.props index 7e89c3a06b..6249e8e81b 100644 --- a/BookStore-Blazor-EfCore/common.props +++ b/BookStore-Blazor-EfCore/common.props @@ -1,19 +1,21 @@ - - - latest - 1.0.0 - $(NoWarn);CS1591 - app - - - - - $(NoWarn);0436 - - - - - - - + + + latest + 1.0.0 + $(NoWarn);CS1591 + app + + + + + $(NoWarn);0436 + + + + + + + + + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/abp-studio/k8s-profiles/local.abpk8s.json b/BookStore-Blazor-EfCore/etc/abp-studio/k8s-profiles/local.abpk8s.json new file mode 100644 index 0000000000..b0aa9c51fd --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/abp-studio/k8s-profiles/local.abpk8s.json @@ -0,0 +1,10 @@ +{ + "config": { + "context": "docker-desktop", + "namespace": "bookstore-local" + }, + "metadata": { + "dotnetEnvironment": "Staging" + }, + "services": {} +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/abp-studio/run-profiles/Default.abprun.json b/BookStore-Blazor-EfCore/etc/abp-studio/run-profiles/Default.abprun.json new file mode 100644 index 0000000000..e47a868ff1 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/abp-studio/run-profiles/Default.abprun.json @@ -0,0 +1,28 @@ +{ + "applications": { + "Acme.BookStore.HttpApi.Host": { + "type": "dotnet-project", + "launchUrl": "https://localhost:44330", + "path": "../../../src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj", + "kubernetesService": ".*-httpapihost$", + "healthCheckEndpoint": "/health-status", + "healthUiEndpoint": "/health-ui", + "execution": { + "order": 4 + } + }, + "Acme.BookStore.Blazor": { + "type": "dotnet-project", + "launchUrl": "https://localhost:44352", + "path": "../../../src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj", + "healthCheckEndpoint": "/", + "kubernetesService": ".*-blazor$", + "execution": { + "order": 2 + } + } + }, + "containers": { + "serviceName": "BookStore-Containers", + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/README.md b/BookStore-Blazor-EfCore/etc/docker-compose/README.md new file mode 100644 index 0000000000..4acd006518 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/README.md @@ -0,0 +1,10 @@ +## How to deploy on docker +The application provides the related `Dockerfiles` and `docker-compose` file with scripts. You can build the docker images and run them using docker-compose. The necessary database, DbMigrator, and the application will be running on docker with health checks in an isolated docker network. + +### Creating the docker images +Navigate to _etc/docker-compose_ folder and run the `build-images-locally.ps1` script. You can examine the script to set **image tag** for your images. It is `latest` by default. + +### Running the docker images using docker-compose +Navigate to _etc/docker-compose_ folder and run the `run-docker.ps1` script. The script will generate developer certificates (if it doesn't exist already) with `dotnet dev-certs` command to use HTTPS. Then, the script runs the provided docker-compose file on detached mode. + +> Not: Developer certificate is only valid for **localhost** domain. If you want to deploy to a real DNS in a production environment, use LetsEncrypt or similar tools. diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/appsettings.json b/BookStore-Blazor-EfCore/etc/docker-compose/appsettings.json new file mode 100644 index 0000000000..18e757a5c2 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/appsettings.json @@ -0,0 +1,18 @@ +{ + "App": { + "SelfUrl": "http://localhost:44352" + }, + "AuthServer": { + "Authority": "https://localhost:44330", + "ClientId": "BookStore_Blazor", + "ResponseType": "code" + }, + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44330" + }, + "AbpAccountPublic": { + "BaseUrl": "https://localhost:44330" + } + } +} diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/build-images-locally.ps1 b/BookStore-Blazor-EfCore/etc/docker-compose/build-images-locally.ps1 new file mode 100644 index 0000000000..fd9794ef0b --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/build-images-locally.ps1 @@ -0,0 +1,33 @@ +param ($version='latest') + +$currentFolder = $PSScriptRoot +$slnFolder = Join-Path $currentFolder "../../" + +Write-Host "********* BUILDING DbMigrator *********" -ForegroundColor Green +$dbMigratorFolder = Join-Path $slnFolder "src/Acme.BookStore.DbMigrator" +Set-Location $dbMigratorFolder +dotnet publish -c Release +docker build -f Dockerfile.local -t acme/bookstore-db-migrator:$version . + +Write-Host "********* BUILDING Blazor Application *********" -ForegroundColor Green +$blazorFolder = Join-Path $slnFolder "src/Acme.BookStore.Blazor" +Set-Location $blazorFolder +dotnet publish -c Release -p:PublishTrimmed=false +docker build -f Dockerfile.local -t acme/bookstore-blazor:$version . + +Write-Host "********* BUILDING Api.Host Application *********" -ForegroundColor Green +$hostFolder = Join-Path $slnFolder "src/Acme.BookStore.HttpApi.Host" +Set-Location $hostFolder +dotnet publish -c Release +docker build -f Dockerfile.local -t acme/bookstore-api:$version . + + + + + + + + +### ALL COMPLETED +Write-Host "COMPLETED" -ForegroundColor Green +Set-Location $currentFolder \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/docker-compose.yml b/BookStore-Blazor-EfCore/etc/docker-compose/docker-compose.yml new file mode 100644 index 0000000000..6a4824b664 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/docker-compose.yml @@ -0,0 +1,88 @@ +services: + bookstore-blazor: + image: acme/bookstore-blazor:latest + container_name: bookstore-blazor + build: + context: ../../ + dockerfile: src/Acme.BookStore.Blazor/Dockerfile.local + ports: + - "44352:8081" + depends_on: + - bookstore-api + restart: on-failure + volumes: + - ./appsettings.json:/usr/share/nginx/html/appsettings.json + networks: + - abp-network + + bookstore-api: + image: acme/bookstore-api:latest + container_name: bookstore-api + hostname: bookstore-api + build: + context: ../../ + dockerfile: src/Acme.BookStore.HttpApi.Host/Dockerfile.local + environment: + - ASPNETCORE_URLS=https://+:8081;http://+:8080; + - Kestrel__Certificates__Default__Path=/app/certs/localhost.pfx + - Kestrel__Certificates__Default__Password=dfd2467f-4707-4a24-b4f7-51a503baacd0 + - App__SelfUrl=https://localhost:44367 + - App__CorsOrigins=http://localhost:44352 + - App__HealthCheckUrl=http://bookstore-api:8080/health-status + - AuthServer__RequireHttpsMetadata=false + - AuthServer__Authority=https://localhost:44330 + - ConnectionStrings__Default=User ID=postgres;Password=myPassw0rd;Host=postgres;Port=5432;Database=BookStore;Pooling=false; + ports: + - "44330:8081" + depends_on: + postgres: + condition: service_healthy + restart: on-failure + volumes: + - ./certs:/app/certs + networks: + - abp-network + + + + db-migrator: + image: acme/bookstore-db-migrator:latest + container_name: db-migrator + build: + context: ../../ + dockerfile: src/Acme.BookStore.DbMigrator/Dockerfile.local + environment: + - OpenIddict__Applications__BookStore_Blazor__RootUrl=http://localhost:44352 + - ConnectionStrings__Default=User ID=postgres;Password=myPassw0rd;Host=postgres;Port=5432;Database=BookStore;Pooling=false; + restart: on-failure + depends_on: + postgres: + condition: service_healthy + networks: + - abp-network + + postgres: + container_name: postgres-db + image: postgres:14.1 + ports: + - "5432:5432" + environment: + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "myPassw0rd" + volumes: + - postgres_data:/var/opt/postgres + networks: + - abp-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + postgres_data: + name: bookstore_postgres_data +networks: + abp-network: + name: bookstore-network + driver: bridge \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/run-docker.ps1 b/BookStore-Blazor-EfCore/etc/docker-compose/run-docker.ps1 new file mode 100644 index 0000000000..81bbaf8b14 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/run-docker.ps1 @@ -0,0 +1,15 @@ +$currentFolder = $PSScriptRoot + +$certsFolder = Join-Path $currentFolder "certs" + +If(!(Test-Path -Path $certsFolder)) +{ + New-Item -ItemType Directory -Force -Path $certsFolder + if(!(Test-Path -Path (Join-Path $certsFolder "localhost.pfx") -PathType Leaf)){ + Set-Location $certsFolder + dotnet dev-certs https -v -ep localhost.pfx -p dfd2467f-4707-4a24-b4f7-51a503baacd0 -t + } +} + +Set-Location $currentFolder +docker-compose up -d \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/run-docker.sh b/BookStore-Blazor-EfCore/etc/docker-compose/run-docker.sh new file mode 100644 index 0000000000..d5845d15e1 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/run-docker.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +if [[ ! -d certs ]] +then + mkdir certs + cd certs/ + if [[ ! -f localhost.pfx ]] + then + dotnet dev-certs https -v -ep localhost.pfx -p dfd2467f-4707-4a24-b4f7-51a503baacd0 -t + fi + cd ../ +fi + +docker-compose up -d diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.ps1 b/BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.ps1 new file mode 100644 index 0000000000..58694d086f --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.ps1 @@ -0,0 +1 @@ +docker-compose down \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.sh b/BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.sh new file mode 100644 index 0000000000..4c14f2a175 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/docker-compose/stop-docker.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker-compose down \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/.gitignore b/BookStore-Blazor-EfCore/etc/helm/.gitignore new file mode 100644 index 0000000000..3759cb562e --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/.gitignore @@ -0,0 +1 @@ +bookstore/values.localdev.yaml \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/README.md b/BookStore-Blazor-EfCore/etc/helm/README.md new file mode 100644 index 0000000000..8b132dc6a5 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/README.md @@ -0,0 +1,64 @@ +# Local Kubernetes Guide + +This guide explains how to deploy your microservice template into your local Kubernetes cluster. + +## Pre-requirements + +* [Docker for Desktop](https://www.docker.com/products/docker-desktop/) with Kubernetes enabled +* [Helm](https://helm.sh/docs/intro/install/) for running helm charts +* Install NGINX ingress using helm: +```powershell +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm upgrade --install --version=4.0.19 ingress-nginx ingress-nginx/ingress-nginx +``` +## Configuring HTTPS for Local K8s + +You can run the solution on staging environment in your local Kubernetes cluster with HTTPS. There are various ways to create a self-signed certificate. + +### Installing mkcert +This guide will be using `mkcert` for creating self-signed certificates. Follow the [installation guide](https://github.com/FiloSottile/mkcert#installation) to install mkcert. + +### Creating mkcert Root CA +Use the command to create root (local) certificate authority for your certificates: +```powershell +mkcert -install +``` + +> **Note:** All the certificates created by mkcert certificate creation will be trusted by the local machine +### Run mkcert + +Use the `create-tls-secrets.ps1` PowerShell script to create self-signed certificates for your domains and the tls secret for Kubernetes. + +## Building Images + +Run `build-all-images.ps1` to build all Docker images for the solution. Do this whenever you change the solution code. If you only change a single project, you can use `build-image.ps1` to build only that image, for a faster build. See `build-all-images.ps1` file's content to learn how to use `build-image.ps1` for a single project. + +> Note that you can also use ABP Studio to build one or all the images. + +## Install Charts + +Run `install.ps1` to install or upgrade the helm charts to the Kubernetes cluster. + +> Note that you can also use ABP Studio to install/uninstall charts. + +## Add Entries to the Hosts File + +Ensure that the following entries are added to the `C:\Windows\System32\drivers\etc\hosts` file: + +``` +127.0.0.1 bookstore-local-web +127.0.0.1 bookstore-local-webgateway +127.0.0.1 bookstore-local-authserver +``` + +> Note that ABP Studio automatically adds these entries to your `hosts` file when you *Connect* to your Kubernetes cluster using ABP Studio's Kubernetes integration. + +## Browse + +Now, you can browse the URL: `https://bookstore-local-web` + +## Uninstall Charts + +Run `uninstall.ps1` to uninstall the helm charts from the Kubernetes cluster. + diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore-local-key.pem b/BookStore-Blazor-EfCore/etc/helm/bookstore-local-key.pem new file mode 100644 index 0000000000..1bb20a13b2 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore-local-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDBAIv2nN+2GKXL +CAvCXOuc37aDHl27vKuhk5mbj80lXfol6sd8/qpKI02ns40s1UBnSA2WhfElCxQN +eX6XmIjEfJ/xFuR7/CzKnsusTRqie1IneJTn0yM7XIOjjsg6h9kUXzrYM7N68MfI +5oZZp8F1Prayb0XsIsaDJBvdv+BQXMkxvcqCV1Ss6533fdxqVtM5Ad8G4GoSikIN +jIMZNN4TJSFerLIzzLC+OFz34ruhDPq//QQy+bEOzb84jiALY3zAUxHeQokOr1cp +133mmC+l4Vl8BRRLBMB5rFzwYTkEA5xIQ9JZxyI4Q5s6WvfVdOtZJcP8naPeFmWs +0lJW1+5TAgMBAAECggEAf9qz3agojwIe+rQWziguMVsGFjBMmeyvqjcUQDhwBzwN +VYcFpikyeDCQ5fKNKFEQ/BqAXeHXUNnY6+A7W4PBvqBseBLZQ8VXitbNSBQ/+7lE +QD+iLTzyjwWHcxdIT3Xk+Zjoa4c8c8oEH3OPNt9pyhjEgMo0AO08om2OREUy/SiD +xfikr2hNYY8cWuqW7u4EM5RyEMxFqZHAMRnXRmz4TfOMQ/+uTlCjxLGnhsXKpnjE +wiAr3jAUTuyNhKaEnJM+lMKxGcoqyHDHG8fgTa6+ybizQYMKyLFKXmFS4cIaOC7S +hE53T1BdEQ4vW1pGXElMmbOrMyhaKVFvNw4l3bXqmQKBgQDYMd/l1/avXWvEHhY4 +1QjcP7WDf/htndwHXKeSL4CTiLmGrL3O4lWqzegZ1rqqRjd27y5iP7pYkLUpZTnS +IIWZ98t+0tDR9yYRf8JpDuysLOsU/Ys1JuEnQ2BT6RG3tzq1663Laf2QVV2CHVcf +Ms6Lwc5xzmYxGSgeLEKo2PxmPwKBgQDkiYIXZj+eyKpTFS9HxrxiIPv9PsDvsMy3 +SuCcWrj5gqfIkreL+OMHxUWbFhY14G4tDdNL/l5jY7ElFOqwbll6LY9aURfQBONP +RcORDPUC+7i+JqmVxAS6wnpsD6X/CXOT/1r2nD8fMIIT8FnBVCmbvHzrDmg9mgwe +Zm/r1z067QKBgQDBGztsJ4z2crGRiXY76T1yzY0qGiIid0BTaxVaZAeqwBNHEgCw +TEZMvIK2obA162YbW+TIaTffZ9IJWZtd7yKmtkkTzOYsxV9BfiZ+hJAt8ilApH+1 +SDcQRQRDrwjeWlGcsRiZeuC8DSPq1p49Bbqr5r6ptLxe2qOU39/ixX4dLQKBgQCa +qlkpfuB1lHZ47fBmkiAyBQKlHBA05yFUts8V4ewnqH3mpyyjBRiYzLBTyfnUEoRd +52pllsvIVdKwNtyx9KyHnEfVJuaHuJchsiQtiWhT0Ynw3neMzPEqd62kbl64IGxg +78Ne/NVXRVvzJImJ5myWYlTkO4bekd+7vzXllXBx7QKBgQCwE2mDBtgtdLLRRAj0 +DoHm33QCyEWIhFejNmQF9bgi10Wezu14nt024RGupJS5LN5YrNO0p11wp5tSg0vp +W4iWFsmcR8raB3WpWKH0jaZL+6nEN3yGnfhegBXQrVEMGaqck9co0heVzm6mAW2q +HCQB5i0Q+jWLJ5pUSn+yAN+GYg== +-----END PRIVATE KEY----- diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore-local.pem b/BookStore-Blazor-EfCore/etc/helm/bookstore-local.pem new file mode 100644 index 0000000000..7b643e544c --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore-local.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIEiTCCAvGgAwIBAgIQc789lzIpJprf1cdoYeUc9DANBgkqhkiG9w0BAQsFADCB +iTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMS8wLQYDVQQLDCZERU9O +VFJPTlxhaG1ldEBERU9OVFJPTiAoQWhtZXQgw4dlbGlrKTE2MDQGA1UEAwwtbWtj +ZXJ0IERFT05UUk9OXGFobWV0QERFT05UUk9OIChBaG1ldCDDh2VsaWspMB4XDTI1 +MTAwMjExMjU1OVoXDTI4MDEwMjExMjU1OVowWjEnMCUGA1UEChMebWtjZXJ0IGRl +dmVsb3BtZW50IGNlcnRpZmljYXRlMS8wLQYDVQQLDCZERU9OVFJPTlxhaG1ldEBE +RU9OVFJPTiAoQWhtZXQgw4dlbGlrKTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMEAi/ac37YYpcsIC8Jc65zftoMeXbu8q6GTmZuPzSVd+iXqx3z+qkoj +TaezjSzVQGdIDZaF8SULFA15fpeYiMR8n/EW5Hv8LMqey6xNGqJ7Uid4lOfTIztc +g6OOyDqH2RRfOtgzs3rwx8jmhlmnwXU+trJvRewixoMkG92/4FBcyTG9yoJXVKzr +nfd93GpW0zkB3wbgahKKQg2Mgxk03hMlIV6ssjPMsL44XPfiu6EM+r/9BDL5sQ7N +vziOIAtjfMBTEd5CiQ6vVynXfeaYL6XhWXwFFEsEwHmsXPBhOQQDnEhD0lnHIjhD +mzpa99V061klw/ydo94WZazSUlbX7lMCAwEAAaOBmjCBlzAOBgNVHQ8BAf8EBAMC +BaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUlqgxjll/IVm01+Yn +6Frwe9ZH3UwwTwYDVR0RBEgwRoIPYm9va3N0b3JlLWxvY2FsghZib29rc3RvcmUt +bG9jYWwtYmxhem9yghtib29rc3RvcmUtbG9jYWwtaHR0cGFwaWhvc3QwDQYJKoZI +hvcNAQELBQADggGBAIyw0X7xMNpO6jDo+ZIbs6SxGbH+JnnDO5iTbt3fVuP1R/+o +9qHHPqn+n9+sPZoR+OqIj5hNeOX4dPkGhO5hvSnBP/UojLO9iWXJt6SKV0hsaSdd +/rCiuS6aIkfi/kQyhbw9om2jJSsziIThhby+FxT0XbTn1S7VwLFkfmRaph5tAAWZ +/m/dn4i1cfFf9GC6cFRJpoz09z03fkTAnytGrYfIf97wVrPEx0bVxULVqJx+tM0y +ZYLNUr8kppf8L1YDITETpcuV0/DPuD2+V0ri8HsezkjOwi3/GMThYYs00fOWufFe +CyrYxhJWEz+OglP1Cw89bpv6z+JiS4ffcHy1yUbdnAfd8x4pVuWzHPddZL590ABs +6UNn/0fFxLRA/QGiImkaIZuGOPeiT2+L97zVJ7lBhb+rR/mpOoPxE+lc/wMEUNlR +iZOVXhp56+4qq0iQa7kaFbD/46AS7bHJg9bZzm2ezFdNhQXF4qyzJ4xIRJqgY6QI +SxkGMYeyF8uv5imcrw== +-----END CERTIFICATE----- diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/Chart.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/Chart.yaml new file mode 100644 index 0000000000..200085d53a --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: bookstore +version: 1.0.0 +appVersion: "1.0" +description: BookStore Solution \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/Chart.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/Chart.yaml new file mode 100644 index 0000000000..ac107f70e5 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: blazor +appVersion: "1.0" +description: BookStore Blazor Application +version: 1.0.0 +type: application \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-configmap.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-configmap.yaml new file mode 100644 index 0000000000..b5b3da334a --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-configmap.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-configmap +data: + appsettings.json: |- + { + "App": { + "SelfUrl": "{{ include "bookstore.hosts.blazor" . }}" + }, + "AuthServer": { + "Authority": "{{ include "bookstore.hosts.httpapi" . }}", "ClientId": "BookStore_Blazor", + "ResponseType": "code" + }, + "RemoteServices": { + "Default": { + "BaseUrl": "{{ include "bookstore.hosts.httpapi" . }}" + }, + "AbpAccountPublic": { + "BaseUrl": "{{ include "bookstore.hosts.httpapi" . }}" } + } + } \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-ingress.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-ingress.yaml new file mode 100644 index 0000000000..824a7c3140 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-ingress.yaml @@ -0,0 +1,27 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + annotations: + nginx.ingress.kubernetes.io/rewrite-target: "/" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + nginx.ingress.kubernetes.io/proxy-buffer-size: "32k" + nginx.ingress.kubernetes.io/proxy-buffers-number: "8" + cert-manager.io/cluster-issuer: "letsencrypt" +spec: + ingressClassName: "nginx" + tls: + - hosts: + - "{{ (include "bookstore.hosts.blazor" .) | trimPrefix "https://" }}" + secretName: "{{ .Values.global.tlsSecret }}" + rules: + - host: "{{ (include "bookstore.hosts.blazor" .) | trimPrefix "https://" }}" + http: + paths: + - path: / + pathType: "Prefix" + backend: + service: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + port: + number: 80 \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-service.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-service.yaml new file mode 100644 index 0000000000..4a9defcaff --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + ports: + - name: "80" + port: 80 + selector: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor.yaml new file mode 100644 index 0000000000..d2c940e1cf --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/templates/blazor.yaml @@ -0,0 +1,28 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + selector: + matchLabels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + template: + metadata: + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + spec: + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + ports: + - name: "http" + containerPort: 80 + volumeMounts: + - name: config-volume + mountPath: /app/wwwroot/appsettings.json + subPath: appsettings.json + volumes: + - name: config-volume + configMap: + name: {{ .Release.Name }}-{{ .Chart.Name }}-configmap \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/values.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/values.yaml new file mode 100644 index 0000000000..a0f5ae71e9 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/blazor/values.yaml @@ -0,0 +1,4 @@ +image: + repository: "bookstore/blazor" + tag: "latest" + pullPolicy: IfNotPresent \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/Chart.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/Chart.yaml new file mode 100644 index 0000000000..07475368db --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: dbmigrator +appVersion: "1.0" +description: BookStore Database Migrator +version: 1.0.0 +type: application \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/templates/migrator.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/templates/migrator.yaml new file mode 100644 index 0000000000..08010a96a5 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/templates/migrator.yaml @@ -0,0 +1,43 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + backoffLimit: 10 + manualSelector: true + selector: + matchLabels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + template: + metadata: + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + spec: + activeDeadlineSeconds: 180 + restartPolicy: Never + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + ports: + - name: "http" + containerPort: 80 + env: + - name: "DOTNET_ENVIRONMENT" + value: "{{ .Values.global.dotnetEnvironment }}" + - name: "ConnectionStrings__Default" + value: "{{ .Values.global.connectionStrings.default | replace "[RELEASE_NAME]" .Release.Name }}" + - name: "AbpStudioClient__StudioUrl" + value: "{{ .Values.global.abpStudioClient.studioUrl }}" + - name: "AbpStudioClient__IsLinkEnabled" + value: "{{ .Values.global.abpStudioClient.isLinkEnabled }}" + - name: "OpenIddict__Applications__BookStore_App__ClientId" + value: "BookStore_App" + - name: "OpenIddict__Applications__BookStore_Blazor__ClientId" + value: "BookStore_Blazor" + - name: "OpenIddict__Applications__BookStore_Blazor__RootUrl" + value: "{{ include "bookstore.hosts.blazor" . }}" + - name: "OpenIddict__Applications__BookStore_Swagger__ClientId" + value: "BookStore_Swagger" + - name: "OpenIddict__Applications__BookStore_Swagger__RootUrl" + value: "{{ include "bookstore.hosts.httpapi" . }}" diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/values.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/values.yaml new file mode 100644 index 0000000000..3d87c1121e --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/dbmigrator/values.yaml @@ -0,0 +1,6 @@ +image: + repository: "bookstore/dbmigrator" + tag: "latest" + pullPolicy: IfNotPresent +authServer: + clientSecret: "1q2w3e*" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/Chart.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/Chart.yaml new file mode 100644 index 0000000000..4456704ba8 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: httpapihost +appVersion: "1.0" +description: BookStore HttpApi Host Application +version: 1.0.0 +type: application \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-ingress.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-ingress.yaml new file mode 100644 index 0000000000..50eee33f2a --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-ingress.yaml @@ -0,0 +1,27 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + annotations: + nginx.ingress.kubernetes.io/rewrite-target: "/" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + nginx.ingress.kubernetes.io/proxy-buffer-size: "32k" + nginx.ingress.kubernetes.io/proxy-buffers-number: "8" + cert-manager.io/cluster-issuer: "letsencrypt" +spec: + ingressClassName: "nginx" + tls: + - hosts: + - "{{ (include "bookstore.hosts.httpapi" .) | trimPrefix "https://" }}" + secretName: "{{ .Values.global.tlsSecret }}" + rules: + - host: "{{ (include "bookstore.hosts.httpapi" .) | trimPrefix "https://" }}" + http: + paths: + - path: / + pathType: "Prefix" + backend: + service: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + port: + number: 80 \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-service.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-service.yaml new file mode 100644 index 0000000000..4a9defcaff --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + ports: + - name: "80" + port: 80 + selector: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost.yaml new file mode 100644 index 0000000000..a3f59a0ff9 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/templates/httpapihost.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + selector: + matchLabels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + template: + metadata: + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + spec: + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + ports: + - name: "http" + containerPort: 80 + readinessProbe: + httpGet: + path: /health-status + port: 80 + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 3 + env: + - name: "DOTNET_ENVIRONMENT" + value: "{{ .Values.global.dotnetEnvironment }}" + - name: "App__SelfUrl" + value: "{{ include "bookstore.hosts.httpapi" . }}" + - name: "App__CorsOrigins" + value: "https://*.BookStore.com,{{ include "bookstore.hosts.blazor" . }}" + - name: "App__RedirectAllowedUrls" + value: "https://*.TestAppBlazorWasm.com,{{ include "bookstore.hosts.blazor" . }}" + - name: App__DisablePII + value: "{{ .Values.global.disablePII }}" + - name: "App__HealthUiCheckUrl" + value: "http://{{ .Release.Name }}-httpapihost/health-status" + - name: "ConnectionStrings__Default" + value: "{{ .Values.global.connectionStrings.default | replace "[RELEASE_NAME]" .Release.Name }}" + - name: "AuthServer__Authority" + value: "{{ include "bookstore.hosts.httpapi" . }}" + - name: "AuthServer__RequireHttpsMetadata" + value: "false" + - name: "StringEncryption__DefaultPassPhrase" + value: "{{ .Values.global.stringEncryptionDefaultPassPhrase }}" + - name: "AbpStudioClient__StudioUrl" + value: "{{ .Values.global.abpStudioClient.studioUrl }}" + - name: "AbpStudioClient__IsLinkEnabled" + value: "{{ .Values.global.abpStudioClient.isLinkEnabled }}" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/values.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/values.yaml new file mode 100644 index 0000000000..73ad5d447f --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/httpapihost/values.yaml @@ -0,0 +1,4 @@ +image: + repository: "bookstore/httpapihost" + tag: "latest" + pullPolicy: IfNotPresent \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/Chart.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/Chart.yaml new file mode 100644 index 0000000000..9aa1df212a --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: postgresql +version: 1.0.0 +appVersion: "1.0" +description: Runs Postgresql Instance \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql-service.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql-service.yaml new file mode 100644 index 0000000000..2c93f683ff --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + type: ClusterIP + ports: + - name: "{{ .Chart.Name }}" + port: {{ .Values.port }} + selector: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql.yaml new file mode 100644 index 0000000000..ef7c597b31 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/templates/postgresql.yaml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + serviceName: "{{ .Release.Name }}-{{ .Chart.Name }}" + replicas: 1 + selector: + matchLabels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + template: + metadata: + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + spec: + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + ports: + - name: "{{ .Chart.Name }}" + containerPort: {{ .Values.port }} + env: + - name: "POSTGRES_PASSWORD" + value: "{{ .Values.sa_password }}" + - name: "POSTGRES_USER" + value: "{{ .Values.sa_user }}" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/values.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/values.yaml new file mode 100644 index 0000000000..84fe78b362 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/charts/postgresql/values.yaml @@ -0,0 +1,6 @@ +port: 5432 +sa_password: "myPassword" +sa_user: "postgres" +image: + repository: "postgres" + tag: "16.0" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/templates/_helpers.tpl b/BookStore-Blazor-EfCore/etc/helm/bookstore/templates/_helpers.tpl new file mode 100644 index 0000000000..3541e70029 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/templates/_helpers.tpl @@ -0,0 +1,6 @@ +{{- define "bookstore.hosts.httpapi" -}} +{{- print "https://" (.Values.global.hosts.httpapi | replace "[RELEASE_NAME]" .Release.Name) -}} +{{- end -}} +{{- define "bookstore.hosts.blazor" -}} +{{- print "https://" (.Values.global.hosts.blazor | replace "[RELEASE_NAME]" .Release.Name) -}} +{{- end -}} diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/values.bookstore-local.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/values.bookstore-local.yaml new file mode 100644 index 0000000000..baeffd297b --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/values.bookstore-local.yaml @@ -0,0 +1,12 @@ +global: + hosts: + dbmigrator: "[RELEASE_NAME]-dbmigrator" + httpapi: "[RELEASE_NAME]-httpapihost" + blazor: "[RELEASE_NAME]-blazor" + connectionStrings: + default: "Host=[RELEASE_NAME]-postgresql;Port=5432;Database=BookStore;User ID=postgres;Password=myPassword;" + dotnetEnvironment: "Staging" + disablePII: "false" + stringEncryptionDefaultPassPhrase: "0uFikygpIPCtQ5XU" + abpStudioClient: + isLinkEnabled: "true" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/bookstore/values.yaml b/BookStore-Blazor-EfCore/etc/helm/bookstore/values.yaml new file mode 100644 index 0000000000..0d0e6873a2 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/bookstore/values.yaml @@ -0,0 +1,4 @@ +global: + tlsSecret: "bookstore-local-tls" + abpStudioClient: + studioUrl: "http://abp-studio-proxy:38271" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/build-all-images.ps1 b/BookStore-Blazor-EfCore/etc/helm/build-all-images.ps1 new file mode 100644 index 0000000000..60f40e871a --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/build-all-images.ps1 @@ -0,0 +1,3 @@ +./build-image.ps1 -ProjectPath "../../src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj" -ImageName bookstore/dbmigrator +./build-image.ps1 -ProjectPath "../../src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj" -ImageName bookstore/httpapihost +./build-image.ps1 -ProjectPath "../../src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj" -ImageName bookstore/blazor diff --git a/BookStore-Blazor-EfCore/etc/helm/build-image.ps1 b/BookStore-Blazor-EfCore/etc/helm/build-image.ps1 new file mode 100644 index 0000000000..125ed54793 --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/build-image.ps1 @@ -0,0 +1,75 @@ +param ( + $ProjectPath, + $ImageName, + $Version="auto", + $ProjectType="dotnet" +) + +if ($Version -eq 'auto') { + $Version = Get-Date -Format "yyyyMMdd.HHmmss" +} + +$currentFolder = $PSScriptRoot +$relativeProjectFolder = [System.IO.Path]::GetExtension($ProjectPath) -eq "" ? $ProjectPath : [System.IO.Path]::GetDirectoryName($ProjectPath) +$projectFolder = Join-Path $currentFolder $relativeProjectFolder + +Set-Location $projectFolder + +try +{ + $projectFileName = [System.IO.Path]::GetFileName($ProjectPath) + + if($ProjectType -eq "dotnet") + { + Write-Host "Publishing Dotnet Project: ${projectFileName}" -ForegroundColor Green -BackgroundColor Black + dotnet publish -c Release + + if (-Not $?) { + Write-Error "Publishing Dotnet Project failed: $projectFileName" + exit $LASTEXITCODE + } + } + + Write-Host "Building Docker Image: ${ImageName}" -ForegroundColor Green -BackgroundColor Black + $Env:DOCKER_SCAN_SUGGEST="false" + docker build . -f Dockerfile -t ${ImageName}:${Version} + + # BEGIN: UPDATE values.localdev.yaml + + $splitImageName = $ImageName -split '/' + $subChartName = $splitImageName[1] + + # Full path of the values.localdev.yaml file + $localDevFilePath = Join-Path $PSScriptRoot "bookstore/values.localdev.yaml" + + # If the values.localdev.yaml file does not exist, create it first + if (!(Test-Path $localDevFilePath)) { + New-Item -ItemType File -Path $localDevFilePath | Out-Null + } + + # Content to write to the file. + $chartSectionContent = @" +${subChartName}: + image: + tag: "${Version}" +"@ + + # Read the existing content from the file + $existingContent = Get-Content -Path $localDevFilePath -Raw + + # Check if the existing content contains the service name, and replace it if found. + if ($existingContent -match "${subChartName}:") { + $existingContent = $existingContent -replace "(?s)${subChartName}:.*?tag:.*", $chartSectionContent.Trim() + } else { + $existingContent += $chartSectionContent + } + + # Write the updated content to the file. + Set-Content -Path $localDevFilePath -Value $existingContent + + # END: UPDATE values.localdev.yaml +} +finally +{ + Set-Location $currentFolder +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/create-tls-secrets.ps1 b/BookStore-Blazor-EfCore/etc/helm/create-tls-secrets.ps1 new file mode 100644 index 0000000000..112c16faea --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/create-tls-secrets.ps1 @@ -0,0 +1,14 @@ +param ( + $Namespace="bookstore-local", + $User = "" +) + +$BaseNamespace = $Namespace +if([string]::IsNullOrEmpty($User) -eq $false) +{ + $Namespace += '-' + $User +} + +mkcert --cert-file "${Namespace}.pem" --key-file "${Namespace}-key.pem" "${Namespace}" "${Namespace}-blazor" "${Namespace}-httpapihost" +kubectl create namespace ${Namespace} +kubectl create secret tls -n ${Namespace} ${BaseNamespace}-tls --cert=./${Namespace}.pem --key=./${Namespace}-key.pem \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/install.ps1 b/BookStore-Blazor-EfCore/etc/helm/install.ps1 new file mode 100644 index 0000000000..f426a482ff --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/install.ps1 @@ -0,0 +1,23 @@ +param ( + $ChartName="bookstore", + $Namespace="bookstore-local", + $ReleaseName="bookstore-local", + $DotnetEnvironment="Staging", + $User = "" +) + +# Create values.localdev.yaml if not exists +$localDevFilePath = Join-Path $PSScriptRoot "bookstore/values.localdev.yaml" +if (!(Test-Path $localDevFilePath)) { + New-Item -ItemType File -Path $localDevFilePath | Out-Null +} + +$FinalReleaseName = $ReleaseName +if([string]::IsNullOrEmpty($User) -eq $false) +{ + $Namespace += '-' + $User + $FinalReleaseName += '-' + $User +} + +# Install (or upgrade) the Helm chart +helm upgrade --install ${FinalReleaseName} ${ChartName} --namespace ${Namespace} --create-namespace --set global.dotnetEnvironment=${DotnetEnvironment} -f "bookstore/values.localdev.yaml" -f "$ChartName/values.${ReleaseName}.yaml" \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/etc/helm/uninstall.ps1 b/BookStore-Blazor-EfCore/etc/helm/uninstall.ps1 new file mode 100644 index 0000000000..6f265beb9c --- /dev/null +++ b/BookStore-Blazor-EfCore/etc/helm/uninstall.ps1 @@ -0,0 +1,13 @@ +param ( + $Namespace="bookstore-local", + $ReleaseName="bookstore-local", + $User = "" +) + +if([string]::IsNullOrEmpty($User) -eq $false) +{ + $Namespace += '-' + $User + $ReleaseName += '-' + $User +} + +helm uninstall ${ReleaseName} --namespace ${Namespace} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg new file mode 100644 index 0000000000..24002ca2cb --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg.analyze.json new file mode 100644 index 0000000000..3c70a7c37d --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.abppkg.analyze.json @@ -0,0 +1,132 @@ +{ + "name": "Acme.BookStore.Application.Contracts", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Acme.BookStore.Domain.Shared", + "namespace": "Acme.BookStore", + "name": "BookStoreDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.Application.Contracts", + "namespace": "Volo.Abp.FeatureManagement", + "name": "AbpFeatureManagementApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.Application.Contracts", + "namespace": "Volo.Abp.SettingManagement", + "name": "AbpSettingManagementApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.Application.Contracts", + "namespace": "Volo.Abp.Identity", + "name": "AbpIdentityApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Public.Application.Contracts", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountPublicApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Admin.Application.Contracts", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountAdminApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.Application.Contracts", + "namespace": "Volo.Abp.AuditLogging", + "name": "AbpAuditLoggingApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Application.Contracts", + "namespace": "Volo.Abp.OpenIddict", + "name": "AbpOpenIddictProApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Application.Contracts", + "namespace": "Volo.Abp.TextTemplateManagement", + "name": "TextTemplateManagementApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.Application.Contracts", + "namespace": "Volo.Abp.LanguageManagement", + "name": "LanguageManagementApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.Application.Contracts", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.Application.Contracts", + "namespace": "Volo.Abp.PermissionManagement", + "name": "AbpPermissionManagementApplicationContractsModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreApplicationContractsModule", + "summary": null + }, + { + "displayName": "Dashboard", + "isEnabled": true, + "contentType": "permission", + "name": "BookStore.Dashboard.Tenant", + "summary": null + }, + { + "displayName": "Dashboard", + "isEnabled": true, + "contentType": "permission", + "name": "BookStore.Dashboard.Host", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj index 22f4d7ed9b..0686c2c04d 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj @@ -1,24 +1,30 @@ - - - - - - netstandard2.0 - Acme.BookStore - - - - - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/AuthorDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/AuthorDto.cs index d37227e5da..2e11035af1 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/AuthorDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/AuthorDto.cs @@ -1,14 +1,13 @@ -using System; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore.Authors; - -[Serializable] -public class AuthorDto : EntityDto -{ - public string Name { get; set; } - - public DateTime BirthDate { get; set; } - - public string ShortBio { get; set; } -} +using System; +using Volo.Abp.Application.Dtos; + +namespace Acme.BookStore.Authors; + +public class AuthorDto : EntityDto +{ + public string Name { get; set; } + + public DateTime BirthDate { get; set; } + + public string ShortBio { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/CreateAuthorDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/CreateAuthorDto.cs index e871fc0fe4..5ae2af026e 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/CreateAuthorDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/CreateAuthorDto.cs @@ -1,17 +1,16 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace Acme.BookStore.Authors; - -[Serializable] -public class CreateAuthorDto -{ - [Required] - [StringLength(AuthorConsts.MaxNameLength)] - public string Name { get; set; } - - [Required] - public DateTime BirthDate { get; set; } - - public string ShortBio { get; set; } -} +using System; +using System.ComponentModel.DataAnnotations; + +namespace Acme.BookStore.Authors; + +public class CreateAuthorDto +{ + [Required] + [StringLength(AuthorConsts.MaxNameLength)] + public string Name { get; set; } = string.Empty; + + [Required] + public DateTime BirthDate { get; set; } + + public string? ShortBio { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/GetAuthorListDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/GetAuthorListDto.cs index 892022c958..cdd64f4521 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/GetAuthorListDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/GetAuthorListDto.cs @@ -1,10 +1,8 @@ -using System; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore.Authors; - -[Serializable] -public class GetAuthorListDto : PagedAndSortedResultRequestDto -{ - public string Filter { get; set; } -} +using Volo.Abp.Application.Dtos; + +namespace Acme.BookStore.Authors; + +public class GetAuthorListDto : PagedAndSortedResultRequestDto +{ + public string? Filter { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/IAuthorAppService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/IAuthorAppService.cs index 2c68463baa..ba5c3e9726 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/IAuthorAppService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/IAuthorAppService.cs @@ -1,19 +1,19 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; - -namespace Acme.BookStore.Authors; - -public interface IAuthorAppService : IApplicationService -{ - Task GetAsync(Guid id); - - Task> GetListAsync(GetAuthorListDto input); - - Task CreateAsync(CreateAuthorDto input); - - Task UpdateAsync(Guid id, UpdateAuthorDto input); - - Task DeleteAsync(Guid id); -} +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace Acme.BookStore.Authors; + +public interface IAuthorAppService : IApplicationService +{ + Task GetAsync(Guid id); + + Task> GetListAsync(GetAuthorListDto input); + + Task CreateAsync(CreateAuthorDto input); + + Task UpdateAsync(Guid id, UpdateAuthorDto input); + + Task DeleteAsync(Guid id); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/UpdateAuthorDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/UpdateAuthorDto.cs index f9e973ba42..d285af2e37 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/UpdateAuthorDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Authors/UpdateAuthorDto.cs @@ -1,16 +1,16 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace Acme.BookStore.Authors; - -public class UpdateAuthorDto -{ - [Required] - [StringLength(AuthorConsts.MaxNameLength)] - public string Name { get; set; } - - [Required] - public DateTime BirthDate { get; set; } - - public string ShortBio { get; set; } -} +using System; +using System.ComponentModel.DataAnnotations; + +namespace Acme.BookStore.Authors; + +public class UpdateAuthorDto +{ + [Required] + [StringLength(AuthorConsts.MaxNameLength)] + public string Name { get; set; } = string.Empty; + + [Required] + public DateTime BirthDate { get; set; } + + public string? ShortBio { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs index b4121d0f41..083a7cf652 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs @@ -1,28 +1,37 @@ -using Volo.Abp.Account; -using Volo.Abp.FeatureManagement; -using Volo.Abp.Identity; -using Volo.Abp.Modularity; -using Volo.Abp.ObjectExtending; -using Volo.Abp.PermissionManagement; -using Volo.Abp.SettingManagement; -using Volo.Abp.TenantManagement; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreDomainSharedModule), - typeof(AbpAccountApplicationContractsModule), - typeof(AbpFeatureManagementApplicationContractsModule), - typeof(AbpIdentityApplicationContractsModule), - typeof(AbpPermissionManagementApplicationContractsModule), - typeof(AbpSettingManagementApplicationContractsModule), - typeof(AbpTenantManagementApplicationContractsModule), - typeof(AbpObjectExtendingModule) -)] -public class BookStoreApplicationContractsModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - BookStoreDtoExtensions.Configure(); - } -} +using Volo.Abp.Account; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.AuditLogging; +using Volo.Abp.LanguageManagement; +using Volo.Abp.TextTemplateManagement; +using Volo.Saas.Host; +using Volo.Abp.Gdpr; +using Volo.Abp.OpenIddict; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreDomainSharedModule), + typeof(AbpFeatureManagementApplicationContractsModule), + typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpIdentityApplicationContractsModule), + typeof(AbpAccountPublicApplicationContractsModule), + typeof(AbpAccountAdminApplicationContractsModule), + typeof(SaasHostApplicationContractsModule), + typeof(AbpAuditLoggingApplicationContractsModule), + typeof(AbpOpenIddictProApplicationContractsModule), + typeof(TextTemplateManagementApplicationContractsModule), + typeof(LanguageManagementApplicationContractsModule), + typeof(AbpGdprApplicationContractsModule), + typeof(AbpPermissionManagementApplicationContractsModule) +)] +public class BookStoreApplicationContractsModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + BookStoreDtoExtensions.Configure(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreDtoExtensions.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreDtoExtensions.cs index bf3b6d30a9..8701c990f0 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreDtoExtensions.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/BookStoreDtoExtensions.cs @@ -1,28 +1,28 @@ -using Volo.Abp.Identity; -using Volo.Abp.ObjectExtending; -using Volo.Abp.Threading; - -namespace Acme.BookStore; - -public static class BookStoreDtoExtensions -{ - private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); - - public static void Configure() - { - OneTimeRunner.Run(() => - { - /* You can add extension properties to DTOs - * defined in the depended modules. - * - * Example: - * - * ObjectExtensionManager.Instance - * .AddOrUpdateProperty("Title"); - * - * See the documentation for more: - * https://abp.io/docs/latest/Object-Extensions - */ - }); - } -} +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace Acme.BookStore; + +public static class BookStoreDtoExtensions +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can add extension properties to DTOs + * defined in the depended modules. + * + * Example: + * + * ObjectExtensionManager.Instance + * .AddOrUpdateProperty("Title"); + * + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Object-Extensions + */ + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/AuthorLookupDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/AuthorLookupDto.cs index 918c92965f..bfe2146544 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/AuthorLookupDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/AuthorLookupDto.cs @@ -1,10 +1,9 @@ -using System; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore.Books; - -[Serializable] -public class AuthorLookupDto : EntityDto -{ - public string Name { get; set; } -} +using System; +using Volo.Abp.Application.Dtos; + +namespace Acme.BookStore.Books; + +public class AuthorLookupDto : EntityDto +{ + public string Name { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/BookDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/BookDto.cs index 769d9cb189..9680d0314f 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/BookDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/BookDto.cs @@ -1,20 +1,19 @@ -using System; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore.Books; - -[Serializable] -public class BookDto : AuditedEntityDto -{ - public Guid AuthorId { get; set; } - - public string AuthorName { get; set; } - - public string Name { get; set; } - - public BookType Type { get; set; } - - public DateTime PublishDate { get; set; } - - public float Price { get; set; } -} +using System; +using Volo.Abp.Application.Dtos; + +namespace Acme.BookStore.Books; + +public class BookDto : AuditedEntityDto +{ + public Guid AuthorId { get; set; } + + public string AuthorName { get; set; } + + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/CreateUpdateBookDto.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/CreateUpdateBookDto.cs index 19f557c23f..6663693c24 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/CreateUpdateBookDto.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/CreateUpdateBookDto.cs @@ -1,24 +1,23 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace Acme.BookStore.Books; - -[Serializable] -public class CreateUpdateBookDto -{ - [Required] - [StringLength(128)] - public string Name { get; set; } - - [Required] - public BookType Type { get; set; } = BookType.Undefined; - - [Required] - [DataType(DataType.Date)] - public DateTime PublishDate { get; set; } = DateTime.Now; - - [Required] - public float Price { get; set; } - - public Guid AuthorId { get; set; } -} +using System; +using System.ComponentModel.DataAnnotations; + +namespace Acme.BookStore.Books; + +public class CreateUpdateBookDto +{ + [Required] + [StringLength(128)] + public string Name { get; set; } = string.Empty; + + [Required] + public BookType Type { get; set; } = BookType.Undefined; + + [Required] + [DataType(DataType.Date)] + public DateTime PublishDate { get; set; } = DateTime.Now; + + [Required] + public float Price { get; set; } + + public Guid AuthorId { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/IBookAppService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/IBookAppService.cs index 7345d5805d..74db3022db 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/IBookAppService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Books/IBookAppService.cs @@ -1,17 +1,16 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; - -namespace Acme.BookStore.Books; - -public interface IBookAppService : - ICrudAppService< //Defines CRUD methods - BookDto, //Used to show books - Guid, //Primary key of the book entity - PagedAndSortedResultRequestDto, //Used for paging/sorting - CreateUpdateBookDto> //Used to create/update a book -{ - // ADD the NEW METHOD - Task> GetAuthorLookupAsync(); -} +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace Acme.BookStore.Books; + +public interface IBookAppService : + ICrudAppService< //Defines CRUD methods + BookDto, //Used to show books + Guid, //Primary key of the book entity + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto> //Used to create/update a book +{ + Task> GetAuthorLookupAsync(); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissionDefinitionProvider.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissionDefinitionProvider.cs index f3cdbfe5ef..22e7878ec1 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissionDefinitionProvider.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissionDefinitionProvider.cs @@ -1,28 +1,39 @@ -using Acme.BookStore.Localization; -using Volo.Abp.Authorization.Permissions; -using Volo.Abp.Localization; - -namespace Acme.BookStore.Permissions; - -public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider -{ - public override void Define(IPermissionDefinitionContext context) - { - var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName, L("Permission:BookStore")); - - var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books")); - booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create")); - booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit")); - booksPermission.AddChild(BookStorePermissions.Books.Delete, L("Permission:Books.Delete")); - - var authorsPermission = bookStoreGroup.AddPermission(BookStorePermissions.Authors.Default, L("Permission:Authors")); - authorsPermission.AddChild(BookStorePermissions.Authors.Create, L("Permission:Authors.Create")); - authorsPermission.AddChild(BookStorePermissions.Authors.Edit, L("Permission:Authors.Edit")); - authorsPermission.AddChild(BookStorePermissions.Authors.Delete, L("Permission:Authors.Delete")); - } - - private static LocalizableString L(string name) - { - return LocalizableString.Create(name); - } -} +using Acme.BookStore.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; + +namespace Acme.BookStore.Permissions; + +public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider +{ + public override void Define(IPermissionDefinitionContext context) + { + var myGroup = context.AddGroup(BookStorePermissions.GroupName); + + myGroup.AddPermission(BookStorePermissions.Dashboard.Host, L("Permission:Dashboard"), MultiTenancySides.Host); + myGroup.AddPermission(BookStorePermissions.Dashboard.Tenant, L("Permission:Dashboard"), MultiTenancySides.Tenant); + + //Define your own permissions here. Example: + //myGroup.AddPermission(BookStorePermissions.MyPermission1, L("Permission:MyPermission1")); + var booksPermission = myGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books")); + booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create")); + booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit")); + booksPermission.AddChild(BookStorePermissions.Books.Delete, L("Permission:Books.Delete")); + + var authorsPermission = myGroup.AddPermission( + BookStorePermissions.Authors.Default, L("Permission:Authors")); + authorsPermission.AddChild( + BookStorePermissions.Authors.Create, L("Permission:Authors.Create")); + authorsPermission.AddChild( + BookStorePermissions.Authors.Edit, L("Permission:Authors.Edit")); + authorsPermission.AddChild( + BookStorePermissions.Authors.Delete, L("Permission:Authors.Delete")); + + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissions.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissions.cs index 87d902bb65..b06241c958 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissions.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application.Contracts/Permissions/BookStorePermissions.cs @@ -1,22 +1,32 @@ -namespace Acme.BookStore.Permissions; - -public static class BookStorePermissions -{ - public const string GroupName = "BookStore"; - - public static class Books - { - public const string Default = GroupName + ".Books"; - public const string Create = Default + ".Create"; - public const string Edit = Default + ".Edit"; - public const string Delete = Default + ".Delete"; - } - - public static class Authors - { - public const string Default = GroupName + ".Authors"; - public const string Create = Default + ".Create"; - public const string Edit = Default + ".Edit"; - public const string Delete = Default + ".Delete"; - } -} +namespace Acme.BookStore.Permissions; + +public static class BookStorePermissions +{ + public const string GroupName = "BookStore"; + + public static class Dashboard + { + public const string DashboardGroup = GroupName + ".Dashboard"; + public const string Host = DashboardGroup + ".Host"; + public const string Tenant = DashboardGroup + ".Tenant"; + } + + + //Add your own permission names. Example: + //public const string MyPermission1 = GroupName + ".MyPermission1"; + public static class Books + { + public const string Default = GroupName + ".Books"; + public const string Create = Default + ".Create"; + public const string Edit = Default + ".Edit"; + public const string Delete = Default + ".Delete"; + } + + public static class Authors + { + public const string Default = GroupName + ".Authors"; + public const string Create = Default + ".Create"; + public const string Edit = Default + ".Edit"; + public const string Delete = Default + ".Delete"; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg new file mode 100644 index 0000000000..75585988f2 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.application" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg.analyze.json new file mode 100644 index 0000000000..74cdeb654c --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.abppkg.analyze.json @@ -0,0 +1,123 @@ +{ + "name": "Acme.BookStore.Application", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Acme.BookStore.Domain", + "namespace": "Acme.BookStore", + "name": "BookStoreDomainModule" + }, + { + "declaringAssemblyName": "Acme.BookStore.Application.Contracts", + "namespace": "Acme.BookStore", + "name": "BookStoreApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.Application", + "namespace": "Volo.Abp.PermissionManagement", + "name": "AbpPermissionManagementApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.Application", + "namespace": "Volo.Abp.FeatureManagement", + "name": "AbpFeatureManagementApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.Application", + "namespace": "Volo.Abp.Identity", + "name": "AbpIdentityApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Public.Application", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountPublicApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Admin.Application", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountAdminApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.Application", + "namespace": "Volo.Abp.AuditLogging", + "name": "AbpAuditLoggingApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Application", + "namespace": "Volo.Abp.TextTemplateManagement", + "name": "TextTemplateManagementApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Application", + "namespace": "Volo.Abp.OpenIddict", + "name": "AbpOpenIddictProApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.Application", + "namespace": "Volo.Abp.LanguageManagement", + "name": "LanguageManagementApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.Application", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprApplicationModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.Application", + "namespace": "Volo.Abp.SettingManagement", + "name": "AbpSettingManagementApplicationModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreApplicationModule", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj index bf28cd8c28..ad0bbbd007 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj @@ -1,24 +1,31 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Authors/AuthorAppService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Authors/AuthorAppService.cs index 4244937699..59ca7f8ea9 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Authors/AuthorAppService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Authors/AuthorAppService.cs @@ -1,90 +1,93 @@ -using Acme.BookStore.Permissions; -using Microsoft.AspNetCore.Authorization; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore.Authors; - -[Authorize(BookStorePermissions.Authors.Default)] -public class AuthorAppService : BookStoreAppService, IAuthorAppService -{ - private readonly IAuthorRepository _authorRepository; - private readonly AuthorManager _authorManager; - - public AuthorAppService( - IAuthorRepository authorRepository, - AuthorManager authorManager) - { - _authorRepository = authorRepository; - _authorManager = authorManager; - } - - public async Task GetAsync(Guid id) - { - var author = await _authorRepository.GetAsync(id); - return ObjectMapper.Map(author); - } - - public async Task> GetListAsync(GetAuthorListDto input) - { - if (input.Sorting.IsNullOrWhiteSpace()) - { - input.Sorting = nameof(Author.Name); - } - - var authors = await _authorRepository.GetListAsync( - input.SkipCount, - input.MaxResultCount, - input.Sorting, - input.Filter - ); - - var totalCount = input.Filter == null - ? await _authorRepository.CountAsync() - : await _authorRepository.CountAsync(author => author.Name.Contains(input.Filter)); - - return new PagedResultDto( - totalCount, - ObjectMapper.Map, List>(authors) - ); - } - - [Authorize(BookStorePermissions.Authors.Create)] - public async Task CreateAsync(CreateAuthorDto input) - { - var author = await _authorManager.CreateAsync( - input.Name, - input.BirthDate, - input.ShortBio - ); - - await _authorRepository.InsertAsync(author); - - return ObjectMapper.Map(author); - } - - [Authorize(BookStorePermissions.Authors.Edit)] - public async Task UpdateAsync(Guid id, UpdateAuthorDto input) - { - var author = await _authorRepository.GetAsync(id); - - if (author.Name != input.Name) - { - await _authorManager.ChangeNameAsync(author, input.Name); - } - - author.BirthDate = input.BirthDate; - author.ShortBio = input.ShortBio; - - await _authorRepository.UpdateAsync(author); - } - - [Authorize(BookStorePermissions.Authors.Delete)] - public async Task DeleteAsync(Guid id) - { - await _authorRepository.DeleteAsync(id); - } -} \ No newline at end of file +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Acme.BookStore.Permissions; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Domain.Repositories; + +namespace Acme.BookStore.Authors; + +[Authorize(BookStorePermissions.Authors.Default)] +public class AuthorAppService : BookStoreAppService, IAuthorAppService +{ + private readonly IAuthorRepository _authorRepository; + private readonly AuthorManager _authorManager; + + public AuthorAppService( + IAuthorRepository authorRepository, + AuthorManager authorManager) + { + _authorRepository = authorRepository; + _authorManager = authorManager; + } + + public async Task GetAsync(Guid id) + { + var author = await _authorRepository.GetAsync(id); + return ObjectMapper.Map(author); + } + + public async Task> GetListAsync(GetAuthorListDto input) + { + if (input.Sorting.IsNullOrWhiteSpace()) + { + input.Sorting = nameof(Author.Name); + } + + var authors = await _authorRepository.GetListAsync( + input.SkipCount, + input.MaxResultCount, + input.Sorting, + input.Filter + ); + + var totalCount = input.Filter == null + ? await _authorRepository.CountAsync() + : await _authorRepository.CountAsync( + author => author.Name.Contains(input.Filter)); + + return new PagedResultDto( + totalCount, + ObjectMapper.Map, List>(authors) + ); + } + + [Authorize(BookStorePermissions.Authors.Create)] + public async Task CreateAsync(CreateAuthorDto input) + { + var author = await _authorManager.CreateAsync( + input.Name, + input.BirthDate, + input.ShortBio + ); + + await _authorRepository.InsertAsync(author); + + return ObjectMapper.Map(author); + } + + [Authorize(BookStorePermissions.Authors.Edit)] + public async Task UpdateAsync(Guid id, UpdateAuthorDto input) + { + var author = await _authorRepository.GetAsync(id); + + if (author.Name != input.Name) + { + await _authorManager.ChangeNameAsync(author, input.Name); + } + + author.BirthDate = input.BirthDate; + author.ShortBio = input.ShortBio; + + await _authorRepository.UpdateAsync(author); + } + + [Authorize(BookStorePermissions.Authors.Delete)] + public async Task DeleteAsync(Guid id) + { + await _authorRepository.DeleteAsync(id); + } + +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreAppService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreAppService.cs index 8e8b91fe5a..b2b3f01092 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreAppService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreAppService.cs @@ -1,17 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Acme.BookStore.Localization; -using Volo.Abp.Application.Services; - -namespace Acme.BookStore; - -/* Inherit your application services from this class. - */ -public abstract class BookStoreAppService : ApplicationService -{ - protected BookStoreAppService() - { - LocalizationResource = typeof(BookStoreResource); - } -} +using Acme.BookStore.Localization; +using Volo.Abp.Application.Services; + +namespace Acme.BookStore; + +/* Inherit your application services from this class. + */ +public abstract class BookStoreAppService : ApplicationService +{ + protected BookStoreAppService() + { + LocalizationResource = typeof(BookStoreResource); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs index 11fff966bf..409243f21f 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs @@ -1,16 +1,19 @@ -using Acme.BookStore.Authors; -using Acme.BookStore.Books; -using AutoMapper; - -namespace Acme.BookStore; - -public class BookStoreApplicationAutoMapperProfile : Profile -{ - public BookStoreApplicationAutoMapperProfile() - { - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - } -} +using Acme.BookStore.Authors; +using Acme.BookStore.Books; +using AutoMapper; + +namespace Acme.BookStore; + +public class BookStoreApplicationAutoMapperProfile : Profile +{ + public BookStoreApplicationAutoMapperProfile() + { + /* You can configure your AutoMapper mapping configuration here. + * Alternatively, you can split your mapping configurations + * into multiple profile classes for a better organization. */ + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs index 30e8878064..00df326d57 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs @@ -1,31 +1,42 @@ -using Volo.Abp.Account; -using Volo.Abp.AutoMapper; -using Volo.Abp.FeatureManagement; -using Volo.Abp.Identity; -using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement; -using Volo.Abp.SettingManagement; -using Volo.Abp.TenantManagement; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreDomainModule), - typeof(AbpAccountApplicationModule), - typeof(BookStoreApplicationContractsModule), - typeof(AbpIdentityApplicationModule), - typeof(AbpPermissionManagementApplicationModule), - typeof(AbpTenantManagementApplicationModule), - typeof(AbpFeatureManagementApplicationModule), - typeof(AbpSettingManagementApplicationModule) - )] -public class BookStoreApplicationModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.AddMaps(); - }); - } -} +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.Account; +using Volo.Abp.Identity; +using Volo.Abp.AutoMapper; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Modularity; +using Volo.Abp.AuditLogging; +using Volo.Abp.Gdpr; +using Volo.Abp.LanguageManagement; +using Volo.Abp.OpenIddict; +using Volo.Abp.TextTemplateManagement; +using Volo.Saas.Host; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreDomainModule), + typeof(BookStoreApplicationContractsModule), + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpFeatureManagementApplicationModule), + typeof(AbpIdentityApplicationModule), + typeof(AbpAccountPublicApplicationModule), + typeof(AbpAccountAdminApplicationModule), + typeof(SaasHostApplicationModule), + typeof(AbpAuditLoggingApplicationModule), + typeof(TextTemplateManagementApplicationModule), + typeof(AbpOpenIddictProApplicationModule), + typeof(LanguageManagementApplicationModule), + typeof(AbpGdprApplicationModule), + typeof(AbpSettingManagementApplicationModule) + )] +public class BookStoreApplicationModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddMaps(); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Books/BookAppService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Books/BookAppService.cs index 2474e6ca23..7dcf4c76c6 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Books/BookAppService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Books/BookAppService.cs @@ -1,127 +1,127 @@ -using Acme.BookStore.Authors; -using Acme.BookStore.Permissions; -using Microsoft.AspNetCore.Authorization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Entities; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore.Books; - -[Authorize(BookStorePermissions.Books.Default)] -public class BookAppService : - CrudAppService< - Book, //The Book entity - BookDto, //Used to show books - Guid, //Primary key of the book entity - PagedAndSortedResultRequestDto, //Used for paging/sorting - CreateUpdateBookDto>, //Used to create/update a book - IBookAppService //implement the IBookAppService -{ - private readonly IAuthorRepository _authorRepository; - - public BookAppService( - IRepository repository, - IAuthorRepository authorRepository) - : base(repository) - { - _authorRepository = authorRepository; - GetPolicyName = BookStorePermissions.Books.Default; - GetListPolicyName = BookStorePermissions.Books.Default; - CreatePolicyName = BookStorePermissions.Books.Create; - UpdatePolicyName = BookStorePermissions.Books.Edit; - DeletePolicyName = BookStorePermissions.Books.Create; - } - - public override async Task GetAsync(Guid id) - { - //Get the IQueryable from the repository - var queryable = await Repository.GetQueryableAsync(); - - //Prepare a query to join books and authors - var query = from book in queryable - join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id - where book.Id == id - select new { book, author }; - - //Execute the query and get the book with author - var queryResult = await AsyncExecuter.FirstOrDefaultAsync(query); - if (queryResult == null) - { - throw new EntityNotFoundException(typeof(Book), id); - } - - var bookDto = ObjectMapper.Map(queryResult.book); - bookDto.AuthorName = queryResult.author.Name; - return bookDto; - } - - public override async Task> GetListAsync(PagedAndSortedResultRequestDto input) - { - //Get the IQueryable from the repository - var queryable = await Repository.GetQueryableAsync(); - - //Prepare a query to join books and authors - var query = from book in queryable - join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id - select new { book, author }; - - //Paging - query = query - .OrderBy(NormalizeSorting(input.Sorting)) - .Skip(input.SkipCount) - .Take(input.MaxResultCount); - - //Execute the query and get a list - var queryResult = await AsyncExecuter.ToListAsync(query); - - //Convert the query result to a list of BookDto objects - var bookDtos = queryResult.Select(x => - { - var bookDto = ObjectMapper.Map(x.book); - bookDto.AuthorName = x.author.Name; - return bookDto; - }).ToList(); - - //Get the total count with another query - var totalCount = await Repository.GetCountAsync(); - - return new PagedResultDto( - totalCount, - bookDtos - ); - } - - public async Task> GetAuthorLookupAsync() - { - var authors = await _authorRepository.GetListAsync(); - - return new ListResultDto( - ObjectMapper.Map, List>(authors) - ); - } - - private static string NormalizeSorting(string sorting) - { - if (sorting.IsNullOrEmpty()) - { - return $"book.{nameof(Book.Name)}"; - } - - if (sorting.Contains("authorName", StringComparison.OrdinalIgnoreCase)) - { - return sorting.Replace( - "authorName", - "author.Name", - StringComparison.OrdinalIgnoreCase - ); - } - - return $"book.{sorting}"; - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; +using Acme.BookStore.Authors; +using Acme.BookStore.Permissions; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; + +namespace Acme.BookStore.Books; + +[Authorize(BookStorePermissions.Books.Default)] +public class BookAppService : + CrudAppService< + Book, //The Book entity + BookDto, //Used to show books + Guid, //Primary key of the book entity + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto>, //Used to create/update a book + IBookAppService //implement the IBookAppService +{ + private readonly IAuthorRepository _authorRepository; + + public BookAppService( + IRepository repository, + IAuthorRepository authorRepository) + : base(repository) + { + _authorRepository = authorRepository; + GetPolicyName = BookStorePermissions.Books.Default; + GetListPolicyName = BookStorePermissions.Books.Default; + CreatePolicyName = BookStorePermissions.Books.Create; + UpdatePolicyName = BookStorePermissions.Books.Edit; + DeletePolicyName = BookStorePermissions.Books.Delete; + } + + public override async Task GetAsync(Guid id) + { + //Get the IQueryable from the repository + var queryable = await Repository.GetQueryableAsync(); + + //Prepare a query to join books and authors + var query = from book in queryable + join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id + where book.Id == id + select new { book, author }; + + //Execute the query and get the book with author + var queryResult = await AsyncExecuter.FirstOrDefaultAsync(query); + if (queryResult == null) + { + throw new EntityNotFoundException(typeof(Book), id); + } + + var bookDto = ObjectMapper.Map(queryResult.book); + bookDto.AuthorName = queryResult.author.Name; + return bookDto; + } + + public override async Task> GetListAsync(PagedAndSortedResultRequestDto input) + { + //Get the IQueryable from the repository + var queryable = await Repository.GetQueryableAsync(); + + //Prepare a query to join books and authors + var query = from book in queryable + join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id + select new { book, author }; + + //Paging + query = query + .OrderBy(NormalizeSorting(input.Sorting)) + .Skip(input.SkipCount) + .Take(input.MaxResultCount); + + //Execute the query and get a list + var queryResult = await AsyncExecuter.ToListAsync(query); + + //Convert the query result to a list of BookDto objects + var bookDtos = queryResult.Select(x => + { + var bookDto = ObjectMapper.Map(x.book); + bookDto.AuthorName = x.author.Name; + return bookDto; + }).ToList(); + + //Get the total count with another query + var totalCount = await Repository.GetCountAsync(); + + return new PagedResultDto( + totalCount, + bookDtos + ); + } + + public async Task> GetAuthorLookupAsync() + { + var authors = await _authorRepository.GetListAsync(); + + return new ListResultDto( + ObjectMapper.Map, List>(authors) + ); + } + + private static string NormalizeSorting(string sorting) + { + if (sorting.IsNullOrEmpty()) + { + return $"book.{nameof(Book.Name)}"; + } + + if (sorting.Contains("authorName", StringComparison.OrdinalIgnoreCase)) + { + return sorting.Replace( + "authorName", + "author.Name", + StringComparison.OrdinalIgnoreCase + ); + } + + return $"book.{sorting}"; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Properties/AssemblyInfo.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Properties/AssemblyInfo.cs index ab4c46c74a..78f64e815c 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Properties/AssemblyInfo.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Application/Properties/AssemblyInfo.cs @@ -1,2 +1,2 @@ -using System.Runtime.CompilerServices; -[assembly:InternalsVisibleToAttribute("Acme.BookStore.Application.Tests")] +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("Acme.BookStore.Application.Tests")] diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.abppkg new file mode 100644 index 0000000000..ee9b098451 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-wasm-client" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.csproj new file mode 100644 index 0000000000..af7f629d19 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Acme.BookStore.Blazor.Client.csproj @@ -0,0 +1,45 @@ + + + + + + net9.0 + enable + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorAutoMapperProfile.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorAutoMapperProfile.cs similarity index 62% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorAutoMapperProfile.cs rename to BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorAutoMapperProfile.cs index f22acc7d73..ebaaa3de51 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorAutoMapperProfile.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorAutoMapperProfile.cs @@ -1,14 +1,15 @@ -using Acme.BookStore.Authors; -using Acme.BookStore.Books; -using AutoMapper; - -namespace Acme.BookStore.Blazor; - -public class BookStoreBlazorAutoMapperProfile : Profile -{ - public BookStoreBlazorAutoMapperProfile() - { - CreateMap(); - CreateMap(); - } -} +using Acme.BookStore.Authors; +using Acme.BookStore.Books; +using AutoMapper; + +namespace Acme.BookStore.Blazor.Client; + +public class BookStoreBlazorAutoMapperProfile : Profile +{ + public BookStoreBlazorAutoMapperProfile() + { + //Define your AutoMapper configuration here for the Blazor project. + CreateMap(); + CreateMap(); + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorClientModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorClientModule.cs new file mode 100644 index 0000000000..aae47f9682 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBlazorClientModule.cs @@ -0,0 +1,160 @@ +using System; +using System.Net.Http; +using Blazorise.Bootstrap5; +using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Acme.BookStore.Blazor.Client.Navigation; +using Localization.Resources.AbpUi; +using Volo.Abp.Localization; +using Acme.BookStore.Localization; +using OpenIddict.Abstractions; +using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; +using Volo.Abp.Autofac.WebAssembly; +using Volo.Abp.AutoMapper; +using Volo.Abp.Modularity; +using Volo.Abp.UI.Navigation; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling; +using Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme; +using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme; +using Volo.Abp.LeptonX.Shared; +using Volo.Abp.SettingManagement.Blazor.WebAssembly; +using Volo.Abp.FeatureManagement.Blazor.WebAssembly; +using Volo.Abp.Account.Pro.Admin.Blazor.WebAssembly; +using Volo.Abp.Account.Pro.Public.Blazor.WebAssembly; +using Volo.Abp.Identity.Pro.Blazor.Server.WebAssembly; +using Volo.Abp.AuditLogging.Blazor.WebAssembly; +using Volo.Abp.Gdpr.Blazor.Extensions; +using Volo.Abp.Gdpr.Blazor.WebAssembly; +using Volo.Abp.LanguageManagement.Blazor.WebAssembly; +using Volo.Abp.OpenIddict.Pro.Blazor.WebAssembly; +using Volo.Abp.TextTemplateManagement.Blazor.WebAssembly; +using Volo.Saas.Host.Blazor.WebAssembly; + +namespace Acme.BookStore.Blazor.Client; + +[DependsOn( + typeof(AbpSettingManagementBlazorWebAssemblyModule), + typeof(AbpFeatureManagementBlazorWebAssemblyModule), + typeof(AbpAutofacWebAssemblyModule), + typeof(AbpAccountAdminBlazorWebAssemblyModule), + typeof(AbpAccountPublicBlazorWebAssemblyModule), + typeof(AbpIdentityProBlazorWebAssemblyModule), + typeof(SaasHostBlazorWebAssemblyModule), + typeof(AbpOpenIddictProBlazorWebAssemblyModule), + typeof(AbpAuditLoggingBlazorWebAssemblyModule), + typeof(AbpGdprBlazorWebAssemblyModule), + typeof(TextTemplateManagementBlazorWebAssemblyModule), + typeof(LanguageManagementBlazorWebAssemblyModule), + typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule), + typeof(BookStoreHttpApiClientModule) +)] +public class BookStoreBlazorClientModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var environment = context.Services.GetSingletonInstance(); + var builder = context.Services.GetSingletonInstance(); + + ConfigureLocalization(); + ConfigureAuthentication(builder); + ConfigureHttpClient(context, environment); + ConfigureBlazorise(context); + ConfigureRouter(context); + ConfigureMenu(context); + ConfigureAutoMapper(context); + ConfigureCookieConsent(context); + ConfigureTheme(); + } + + private void ConfigureLocalization() + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes(typeof(AbpUiResource)); + }); + } + + private void ConfigureCookieConsent(ServiceConfigurationContext context) + { + context.Services.AddAbpCookieConsent(options => + { + options.IsEnabled = true; + options.CookiePolicyUrl = "/CookiePolicy"; + options.PrivacyPolicyUrl = "/PrivacyPolicy"; + }); + } + + private void ConfigureTheme() + { + Configure(options => + { + options.DefaultStyle = LeptonXStyleNames.System; + }); + + Configure(options => + { + // When Layout is changed, the `options.Parameters["LeptonXTheme.Layout"]` in BookStoreBlazorModule.cs should be updated accordingly. + options.Layout = LeptonXBlazorLayouts.SideMenu; + }); + } + + private void ConfigureRouter(ServiceConfigurationContext context) + { + Configure(options => + { + options.AppAssembly = typeof(BookStoreBlazorClientModule).Assembly; + }); + } + + private void ConfigureMenu(ServiceConfigurationContext context) + { + Configure(options => + { + options.MenuContributors.Add(new BookStoreMenuContributor(context.Services.GetConfiguration())); + }); + } + + private void ConfigureBlazorise(ServiceConfigurationContext context) + { + context.Services + .AddBootstrap5Providers() + .AddFontAwesomeIcons(); + } + + private static void ConfigureAuthentication(WebAssemblyHostBuilder builder) + { + builder.Services.AddOidcAuthentication(options => + { + builder.Configuration.Bind("AuthServer", options.ProviderOptions); + options.UserOptions.NameClaim = OpenIddictConstants.Claims.Name; + options.UserOptions.RoleClaim = OpenIddictConstants.Claims.Role; + + options.ProviderOptions.DefaultScopes.Add("BookStore"); + options.ProviderOptions.DefaultScopes.Add("roles"); + options.ProviderOptions.DefaultScopes.Add("email"); + options.ProviderOptions.DefaultScopes.Add("phone"); + }); + } + + private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) + { + context.Services.AddTransient(sp => new HttpClient + { + BaseAddress = new Uri(environment.BaseAddress) + }); + } + + private void ConfigureAutoMapper(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddMaps(); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBrandingProvider.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBrandingProvider.cs new file mode 100644 index 0000000000..67f84e54ef --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreBrandingProvider.cs @@ -0,0 +1,21 @@ +using Microsoft.Extensions.Localization; +using Acme.BookStore.Localization; +using Microsoft.Extensions.Localization; +using Acme.BookStore.Localization; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Ui.Branding; + +namespace Acme.BookStore.Blazor.Client; + +[Dependency(ReplaceServices = true)] +public class BookStoreBrandingProvider : DefaultBrandingProvider +{ + private IStringLocalizer _localizer; + + public BookStoreBrandingProvider(IStringLocalizer localizer) + { + _localizer = localizer; + } + + public override string AppName => _localizer["AppName"]; +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreComponentBase.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreComponentBase.cs similarity index 83% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreComponentBase.cs rename to BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreComponentBase.cs index befe5741ab..299318bb09 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreComponentBase.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/BookStoreComponentBase.cs @@ -1,12 +1,12 @@ -using Acme.BookStore.Localization; -using Volo.Abp.AspNetCore.Components; - -namespace Acme.BookStore.Blazor; - -public abstract class BookStoreComponentBase : AbpComponentBase -{ - protected BookStoreComponentBase() - { - LocalizationResource = typeof(BookStoreResource); - } -} +using Acme.BookStore.Localization; +using Volo.Abp.AspNetCore.Components; + +namespace Acme.BookStore.Blazor.Client; + +public abstract class BookStoreComponentBase : AbpComponentBase +{ + protected BookStoreComponentBase() + { + LocalizationResource = typeof(BookStoreResource); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Components/Layout/LeptonXFooter.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Components/Layout/LeptonXFooter.razor new file mode 100644 index 0000000000..87c9750ce2 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Components/Layout/LeptonXFooter.razor @@ -0,0 +1,22 @@ +@using Volo.Abp.DependencyInjection +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu + +@inherits Footer +@attribute [ExposeServices(typeof(Footer))] +@attribute [Dependency(ReplaceServices = true)] + +
+
+ + +
+
diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenuContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenuContributor.cs new file mode 100644 index 0000000000..be1a7365b2 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenuContributor.cs @@ -0,0 +1,153 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Acme.BookStore.Localization; +using Acme.BookStore.Permissions; +using Acme.BookStore.MultiTenancy; +using Volo.Abp.Account.Localization; +using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.SettingManagement.Blazor.Menus; +using Volo.Abp.Users; +using Volo.Abp.Identity.Pro.Blazor.Navigation; +using Volo.Abp.AuditLogging.Blazor.Menus; +using Volo.Abp.LanguageManagement.Blazor.Menus; +using Volo.Abp.TextTemplateManagement.Blazor.Menus; +using Volo.Abp.OpenIddict.Pro.Blazor.Menus; +using Volo.Saas.Host.Blazor.Navigation; + +namespace Acme.BookStore.Blazor.Client.Navigation; + +public class BookStoreMenuContributor : IMenuContributor +{ + private readonly IConfiguration _configuration; + + public BookStoreMenuContributor(IConfiguration configuration) + { + _configuration = configuration; + } + + public async Task ConfigureMenuAsync(MenuConfigurationContext context) + { + if (context.Menu.Name == StandardMenus.Main) + { + await ConfigureMainMenuAsync(context); + } + else if (context.Menu.Name == StandardMenus.User) + { + await ConfigureUserMenuAsync(context); + } + } + + private static async Task ConfigureMainMenuAsync(MenuConfigurationContext context) + { + var l = context.GetLocalizer(); + + //Administration + var administration = context.Menu.GetAdministration(); + administration.Order = 6; + + context.Menu.AddItem(new ApplicationMenuItem( + BookStoreMenus.Home, + l["Menu:Home"], + "/", + icon: "fas fa-home", + order: 1 + )); + + //HostDashboard + context.Menu.AddItem( + new ApplicationMenuItem( + BookStoreMenus.HostDashboard, + l["Menu:Dashboard"], + "/host-dashboard", + icon: "fa fa-chart-line", + order: 2 + ).RequirePermissions(BookStorePermissions.Dashboard.Host) + ); + + //TenantDashboard + context.Menu.AddItem( + new ApplicationMenuItem( + BookStoreMenus.TenantDashboard, + l["Menu:Dashboard"], + "/Dashboard", + icon: "fa fa-chart-line", + order: 2 + ).RequirePermissions(BookStorePermissions.Dashboard.Tenant) + ); + + var bookStoreMenu = new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" + ); + + context.Menu.AddItem(bookStoreMenu); + + //CHECK the PERMISSION + bookStoreMenu.AddItem(new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/books" + ).RequirePermissions(BookStorePermissions.Books.Default)); + + context.Menu.AddItem(new ApplicationMenuItem( + "BooksStore.Authors", + l["Menu:Authors"], + url: "/authors" + ).RequirePermissions(BookStorePermissions.Books.Default)); + + //Saas + context.Menu.SetSubItemOrder(SaasHostMenus.GroupName, 3); + //Administration->Identity + administration.SetSubItemOrder(IdentityProMenus.GroupName, 2); + + //Administration->OpenId + administration.SetSubItemOrder(OpenIddictProMenus.GroupName, 3); + + //Administration->Language Management + administration.SetSubItemOrder(LanguageManagementMenus.GroupName, 4); + + //Administration->Text Template Management + administration.SetSubItemOrder(TextTemplateManagementMenus.GroupName, 5); + + //Administration->Audit Logs + administration.SetSubItemOrder(AbpAuditLoggingMenus.GroupName, 6); + + //Administration->Settings + administration.SetSubItemOrder(SettingManagementMenus.GroupName, 7); + } + + private async Task ConfigureUserMenuAsync(MenuConfigurationContext context) + { + var accountStringLocalizer = context.GetLocalizer(); + var authServerUrl = _configuration["AuthServer:Authority"] ?? ""; + + context.Menu.AddItem(new ApplicationMenuItem( + "Account.Manage", + accountStringLocalizer["MyAccount"], + $"{authServerUrl.EnsureEndsWith('/')}Account/Manage", + icon: "fa fa-cog", + order: 1000, + target: "_blank").RequireAuthenticated()); + + context.Menu.AddItem(new ApplicationMenuItem( + "Account.SecurityLogs", + accountStringLocalizer["MySecurityLogs"], + $"{authServerUrl.EnsureEndsWith('/')}Account/SecurityLogs", + icon: "fa fa-user-shield", + order: 1001, + target: "_blank").RequireAuthenticated()); + + context.Menu.AddItem(new ApplicationMenuItem( + "Account.Sessions", + accountStringLocalizer["Sessions"], + url: $"{authServerUrl.EnsureEndsWith('/')}Account/Sessions", + icon: "fa fa-clock", + order: 1002, + target: "_blank").RequireAuthenticated()); + + await Task.CompletedTask; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenus.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenus.cs new file mode 100644 index 0000000000..b712da46a1 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Navigation/BookStoreMenus.cs @@ -0,0 +1,12 @@ +namespace Acme.BookStore.Blazor.Client.Navigation; + +public class BookStoreMenus +{ + private const string Prefix = "BookStore"; + + public const string Home = Prefix + ".Home"; + + public const string HostDashboard = Prefix + ".HostDashboard"; + + public const string TenantDashboard = Prefix + ".TenantDashboard"; +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Authors.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Authors.razor similarity index 97% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Authors.razor rename to BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Authors.razor index f2e1379374..f99497debc 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Authors.razor +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Authors.razor @@ -1,177 +1,177 @@ -@page "/authors" -@using Acme.BookStore.Authors -@using Acme.BookStore.Localization -@using Volo.Abp.AspNetCore.Components.Web -@inherits BookStoreComponentBase -@inject IAuthorAppService AuthorAppService -@inject AbpBlazorMessageLocalizerHelper LH - - - - -

@L["Authors"]

-
- - @if (CanCreateAuthor) - { - - } - -
-
- - - - - - - - @L["Actions"] - - - @if (CanEditAuthor) - { - - @L["Edit"] - - } - @if (CanDeleteAuthor) - { - - @L["Delete"] - - } - - - - - - - - @context.BirthDate.ToShortDateString() - - - - - -
- - - - -
- - @L["NewAuthor"] - - - - - - - @L["Name"] - - - - - - - - - @L["BirthDate"] - - - - - @L["ShortBio"] - - - - - - - - - - - - - -
-
-
- - - - -
- - @EditingAuthor.Name - - - - - - - @L["Name"] - - - - - - - - - @L["BirthDate"] - - - - - @L["ShortBio"] - - - - - - - - - - - - - -
-
-
+@page "/authors" +@using Acme.BookStore.Authors +@using Acme.BookStore.Localization +@using Volo.Abp.AspNetCore.Components.Web +@inherits BookStoreComponentBase +@inject IAuthorAppService AuthorAppService +@inject AbpBlazorMessageLocalizerHelper LH + + + + +

@L["Authors"]

+
+ + @if (CanCreateAuthor) + { + + } + +
+
+ + + + + + + + @L["Actions"] + + + @if (CanEditAuthor) + { + + @L["Edit"] + + } + @if (CanDeleteAuthor) + { + + @L["Delete"] + + } + + + + + + + + @context.BirthDate.ToShortDateString() + + + + + +
+ + + + +
+ + @L["NewAuthor"] + + + + + + + @L["Name"] + + + + + + + + + @L["BirthDate"] + + + + + @L["ShortBio"] + + + + + + + + + + + + + +
+
+
+ + + + +
+ + @EditingAuthor.Name + + + + + + + @L["Name"] + + + + + + + + + @L["BirthDate"] + + + + + @L["ShortBio"] + + + + + + + + + + + + + +
+
+
diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Authors.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Authors.razor.cs similarity index 94% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Authors.razor.cs rename to BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Authors.razor.cs index e07e06b547..4fcf76d5ab 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Authors.razor.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Authors.razor.cs @@ -1,171 +1,170 @@ -using Acme.BookStore.Authors; -using Acme.BookStore.Permissions; -using Blazorise; -using Blazorise.DataGrid; -using Microsoft.AspNetCore.Authorization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore.Blazor.Pages; - -public partial class Authors -{ - private IReadOnlyList AuthorList { get; set; } - - private int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount; - private int CurrentPage { get; set; } - private string CurrentSorting { get; set; } - private int TotalCount { get; set; } - - private bool CanCreateAuthor { get; set; } - private bool CanEditAuthor { get; set; } - private bool CanDeleteAuthor { get; set; } - - private CreateAuthorDto NewAuthor { get; set; } - - private Guid EditingAuthorId { get; set; } - private UpdateAuthorDto EditingAuthor { get; set; } - - private Modal CreateAuthorModal { get; set; } - private Modal EditAuthorModal { get; set; } - - private Validations CreateValidationsRef; - - private Validations EditValidationsRef; - - public Authors() - { - NewAuthor = new CreateAuthorDto(); - EditingAuthor = new UpdateAuthorDto(); - } - - protected override async Task OnInitializedAsync() - { - await SetPermissionsAsync(); - await GetAuthorsAsync(); - } - - private async Task SetPermissionsAsync() - { - CanCreateAuthor = await AuthorizationService - .IsGrantedAsync(BookStorePermissions.Authors.Create); - - CanEditAuthor = await AuthorizationService - .IsGrantedAsync(BookStorePermissions.Authors.Edit); - - CanDeleteAuthor = await AuthorizationService - .IsGrantedAsync(BookStorePermissions.Authors.Delete); - } - - private async Task GetAuthorsAsync() - { - var result = await AuthorAppService.GetListAsync( - new GetAuthorListDto - { - MaxResultCount = PageSize, - SkipCount = CurrentPage * PageSize, - Sorting = CurrentSorting - } - ); - - AuthorList = result.Items; - TotalCount = (int)result.TotalCount; - } - - private async Task OnDataGridReadAsync(DataGridReadDataEventArgs e) - { - CurrentSorting = e.Columns - .Where(c => c.SortDirection != SortDirection.Default) - .Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : "")) - .JoinAsString(","); - CurrentPage = e.Page - 1; - - await GetAuthorsAsync(); - - await InvokeAsync(StateHasChanged); - } - - private void OpenCreateAuthorModal() - { - CreateValidationsRef.ClearAll(); - - NewAuthor = new CreateAuthorDto(); - CreateAuthorModal.Show(); - } - - private void CloseCreateAuthorModal() - { - CreateAuthorModal.Hide(); - } - - private void OpenEditAuthorModal(AuthorDto author) - { - EditValidationsRef.ClearAll(); - - EditingAuthorId = author.Id; - EditingAuthor = ObjectMapper.Map(author); - EditAuthorModal.Show(); - } - - private async Task DeleteAuthorAsync(AuthorDto author) - { - try - { - var confirmMessage = L["AuthorDeletionConfirmationMessage", author.Name]; - if (!await Message.Confirm(confirmMessage)) - { - return; - } - - await AuthorAppService.DeleteAsync(author.Id); - await GetAuthorsAsync(); - } - catch (Exception ex) - { - await HandleErrorAsync(ex); - } - - } - - private void CloseEditAuthorModal() - { - EditAuthorModal.Hide(); - } - - private async Task CreateAuthorAsync() - { - try - { - if (await CreateValidationsRef.ValidateAll()) - { - await AuthorAppService.CreateAsync(NewAuthor); - await GetAuthorsAsync(); - CreateAuthorModal.Hide(); - } - } - catch (Exception ex) - { - await HandleErrorAsync(ex); - } - } - - private async Task UpdateAuthorAsync() - { - try - { - if (await EditValidationsRef.ValidateAll()) - { - await AuthorAppService.UpdateAsync(EditingAuthorId, EditingAuthor); - await GetAuthorsAsync(); - EditAuthorModal.Hide(); - } - } - catch (Exception ex) - { - await HandleErrorAsync(ex); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Acme.BookStore.Authors; +using Acme.BookStore.Permissions; +using Blazorise; +using Blazorise.DataGrid; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; + +namespace Acme.BookStore.Blazor.Client.Pages; + +public partial class Authors +{ + private IReadOnlyList AuthorList { get; set; } + + private int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount; + private int CurrentPage { get; set; } + private string CurrentSorting { get; set; } + private int TotalCount { get; set; } + + private bool CanCreateAuthor { get; set; } + private bool CanEditAuthor { get; set; } + private bool CanDeleteAuthor { get; set; } + + private CreateAuthorDto NewAuthor { get; set; } + + private Guid EditingAuthorId { get; set; } + private UpdateAuthorDto EditingAuthor { get; set; } + + private Modal CreateAuthorModal { get; set; } + private Modal EditAuthorModal { get; set; } + + private Validations CreateValidationsRef; + + private Validations EditValidationsRef; + + public Authors() + { + NewAuthor = new CreateAuthorDto(); + EditingAuthor = new UpdateAuthorDto(); + } + + protected override async Task OnInitializedAsync() + { + await SetPermissionsAsync(); + await GetAuthorsAsync(); + } + + private async Task SetPermissionsAsync() + { + CanCreateAuthor = await AuthorizationService + .IsGrantedAsync(BookStorePermissions.Authors.Create); + + CanEditAuthor = await AuthorizationService + .IsGrantedAsync(BookStorePermissions.Authors.Edit); + + CanDeleteAuthor = await AuthorizationService + .IsGrantedAsync(BookStorePermissions.Authors.Delete); + } + + private async Task GetAuthorsAsync() + { + var result = await AuthorAppService.GetListAsync( + new GetAuthorListDto + { + MaxResultCount = PageSize, + SkipCount = CurrentPage * PageSize, + Sorting = CurrentSorting + } + ); + + AuthorList = result.Items; + TotalCount = (int)result.TotalCount; + } + + private async Task OnDataGridReadAsync(DataGridReadDataEventArgs e) + { + CurrentSorting = e.Columns + .Where(c => c.SortDirection != SortDirection.Default) + .Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : "")) + .JoinAsString(","); + CurrentPage = e.Page - 1; + + await GetAuthorsAsync(); + + await InvokeAsync(StateHasChanged); + } + + private void OpenCreateAuthorModal() + { + CreateValidationsRef.ClearAll(); + + NewAuthor = new CreateAuthorDto(); + CreateAuthorModal.Show(); + } + + private void CloseCreateAuthorModal() + { + CreateAuthorModal.Hide(); + } + + private void OpenEditAuthorModal(AuthorDto author) + { + EditValidationsRef.ClearAll(); + + EditingAuthorId = author.Id; + EditingAuthor = ObjectMapper.Map(author); + EditAuthorModal.Show(); + } + + private async Task DeleteAuthorAsync(AuthorDto author) + { + try + { + var confirmMessage = L["AuthorDeletionConfirmationMessage", author.Name]; + if (!await Message.Confirm(confirmMessage)) + { + return; + } + + await AuthorAppService.DeleteAsync(author.Id); + await GetAuthorsAsync(); + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } + + private void CloseEditAuthorModal() + { + EditAuthorModal.Hide(); + } + + private async Task CreateAuthorAsync() + { + try + { + if (await CreateValidationsRef.ValidateAll()) + { + await AuthorAppService.CreateAsync(NewAuthor); + await GetAuthorsAsync(); + CreateAuthorModal.Hide(); + } + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } + + private async Task UpdateAuthorAsync() + { + try + { + if (await EditValidationsRef.ValidateAll()) + { + await AuthorAppService.UpdateAsync(EditingAuthorId, EditingAuthor); + await GetAuthorsAsync(); + EditAuthorModal.Hide(); + } + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Books.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Books.razor new file mode 100644 index 0000000000..4fd4a18ad1 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Books.razor @@ -0,0 +1,256 @@ +@page "/books" +@attribute [Authorize(BookStorePermissions.Books.Default)] +@using Acme.BookStore.Permissions +@using Microsoft.AspNetCore.Authorization +@using Volo.Abp +@using Volo.Abp.Application.Dtos +@using Acme.BookStore.Books +@using Acme.BookStore.Localization +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Components.Web +@inject AbpBlazorMessageLocalizerHelper LH +@inherits AbpCrudPageBase + + + + + +

@L["Books"]

+
+ + @if (HasCreatePermission) + { + + } + +
+
+ + + + + + + + + + + + + + + + @L[$"Enum:BookType.{context.Type:D}"] + + + + + @context.PublishDate.ToShortDateString() + + + + + + + @context.CreationTime.ToLongDateString() + + + + + +
+ + + + +
+ + @L["NewBook"] + + + + + + + @L["Author"] + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + +
+
+
+ + + + +
+ + @EditingEntity.Name + + + + + + + @L["Author"] + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + +
+
+
+ +@code +{ + IReadOnlyList authorList = Array.Empty(); + + public Books() // Constructor + { + LocalizationResource = typeof(BookStoreResource); + + CreatePolicyName = BookStorePermissions.Books.Create; + UpdatePolicyName = BookStorePermissions.Books.Edit; + DeletePolicyName = BookStorePermissions.Books.Delete; + } + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + authorList = (await AppService.GetAuthorLookupAsync()).Items; + } + + protected override async Task OpenCreateModalAsync() + { + if (!authorList.Any()) + { + throw new UserFriendlyException(message: L["AnAuthorIsRequiredForCreatingBook"]); + } + + await base.OpenCreateModalAsync(); + NewEntity.AuthorId = authorList.First().Id; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor new file mode 100644 index 0000000000..be9d970f2b --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor @@ -0,0 +1,90 @@ +@page "/CookiePolicy" +@inherits BookStoreComponentBase + +
+

Cookie Policy

+ +
+

+ This cookie policy explains how cookies and similar technologies are used by Acme.BookStore + ("we", "or" or "us") on our websites and other online services (like applications, portals or other + services that use cookies). +

+
+ +
+

What are cookies and why do we use them?

+ +

+ Cookies are small text files stored in your browser’s memory by our websites. They are commonly used to + support various functions on our websites. +

+ +

+ Cookies do other very useful jobs, such as tell us which pages you visited the most, understand how + effective our website has been to you, and improve our communication to you on our products and + services. +

+ +

+ We do not use cookies to collect information that directly identifies you as an individual. However, + some information collected by cookies may be treated as personal data (such as your browsing history, or + your device information). +

+ +

+ Depending on the job the cookie needs to perform, it may be a session or persistent cookie: +

+ +
    +
  • + Persistent cookies are retained on your device until you either erase them or your browser erases + them when the cookie reaches its expiration date. +
  • +
  • + Session cookies are temporary and expire once you close your browser or once your session ends. +
  • +
+
+ +
+

What type of cookies do we use?

+ +

+ We only use the "Strictly Necessary" cookies on our website to improve user experience and these cookies + are required to websites effectively run. +

+ +
+

Strictly Neccessary Cookies

+ + + + + + + + + + + + + + + + + + +
CookieDescription
+ AspNetCore.Antiforgery.* + + Helps prevent Cross-Site Request Forgery (CSRF) attacks. +
+ XSRF-TOKEN + + Ensures visitor browsing-security by preventing cross-site request forgery. This cookie + is essential for the security of the website and visitor. +
+
+
+
\ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor.cs new file mode 100644 index 0000000000..4f30e3a769 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/CookiePolicy.razor.cs @@ -0,0 +1,5 @@ +namespace Acme.BookStore.Blazor.Client.Pages; + +public partial class CookiePolicy +{ +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor new file mode 100644 index 0000000000..539677ba59 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor @@ -0,0 +1,60 @@ +@page "/host-dashboard" +@using Volo.Abp.AuditLogging.Blazor.Pages.Shared.ErrorRateWidget +@using Volo.Abp.AuditLogging.Blazor.Pages.Shared.AverageExecutionDurationPerDayWidget +@using Volo.Abp.AspNetCore.Components.Web.Theming.Layout +@using Volo.Saas.Host.Blazor.Pages.Shared.Components.SaasLatestTenantsWidget +@using Volo.Saas.Host.Blazor.Pages.Shared.Components.SaasEditionPercentageWidget +@inherits BookStoreComponentBase + +@* ************************* PAGE HEADER ************************* *@ + + + + +@* ************************* CONTENT ************************* *@ + + + + + + + @L["Date"] + + + + + + + + + + + + + + + @if (HasAuditLoggingPermission) + { + + + + + + + } + @if (HasSaasPermission) + { + + + + + + + } + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor.cs new file mode 100644 index 0000000000..467f9cf9b3 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/HostDashboard.razor.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Volo.Abp.AuditLogging; +using Volo.Abp.AuditLogging.Blazor.Pages.Shared.AverageExecutionDurationPerDayWidget; +using Volo.Abp.AuditLogging.Blazor.Pages.Shared.ErrorRateWidget; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.BlazoriseUI; +using Volo.Abp.Timing; +using Volo.Saas.Host; +using Volo.Saas.Host.Blazor.Pages.Shared.Components.SaasEditionPercentageWidget; +using Volo.Saas.Host.Blazor.Pages.Shared.Components.SaasLatestTenantsWidget; + +namespace Acme.BookStore.Blazor.Client.Pages; + +public partial class HostDashboard +{ + [Inject] + public IPermissionChecker PermissionChecker { get; set; } = default!; + + protected List BreadcrumbItems = new(); + + protected AuditLoggingErrorRateWidgetComponent? ErrorRateWidgetComponent; + + protected AuditLoggingAverageExecutionDurationPerDayWidgetComponent? AverageExecutionDurationPerDayWidgetComponent; + + protected SaasEditionPercentageWidgetComponent? SaasEditionPercentageWidgetComponent; + + protected SaasLatestTenantsWidgetComponent? SaasLatestTenantsWidgetComponent; + + protected DateTime StartDate { get; set; } + + protected DateTime EndDate { get; set; } + + protected bool HasAuditLoggingPermission { get; set; } + + protected bool HasSaasPermission { get; set; } + + protected async override Task OnInitializedAsync() + { + StartDate = Clock.Now.AddMonths(-1).Date; + EndDate = Clock.Now.Date; + HasAuditLoggingPermission = await PermissionChecker.IsGrantedAsync(AbpAuditLoggingPermissions.AuditLogs.Default); + HasSaasPermission = await PermissionChecker.IsGrantedAsync(SaasHostPermissions.Tenants.Default); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await SetBreadcrumbItemsAsync(); + await InvokeAsync(StateHasChanged); + } + } + + protected virtual async Task RefreshAsync() + { + if (HasAuditLoggingPermission) + { + if (ErrorRateWidgetComponent != null) + { + await ErrorRateWidgetComponent.RefreshAsync(); + } + + if(AverageExecutionDurationPerDayWidgetComponent != null) + { + await AverageExecutionDurationPerDayWidgetComponent.RefreshAsync(); + } + } + + if (HasSaasPermission && SaasEditionPercentageWidgetComponent != null) + { + await SaasEditionPercentageWidgetComponent.RefreshAsync(); + } + } + + protected virtual ValueTask SetBreadcrumbItemsAsync() + { + BreadcrumbItems.Add(new BreadcrumbItem(L["Dashboard"])); + return ValueTask.CompletedTask; + } + + protected virtual Task OnDatesChangedAsync(IReadOnlyList dates) + { + StartDate = dates.Min(); + EndDate = dates.Max(); + + return Task.CompletedTask; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor new file mode 100644 index 0000000000..2dc5ad15ed --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor @@ -0,0 +1,282 @@ +@page "/" +@inherits BookStoreComponentBase + +
+
+
+
+
+ @if (!CurrentUser.IsAuthenticated) + { +

@L["Welcome"]

+

@L["LongWelcomeMessage"]

+ @L["Login"] + } + +

Getting Started

+

Learn how to create and run + a + new web application using the application startup + template.

+ Getting + Started + +

Web Application Development Tutorial

+

Learn how to build an ABP based + web + application named Acme.BookStore.

+ Explore Tutorial + +

Customize Lepton Theme

+

Learn how to customize LeptonX + Theme + as you wish.

+ Customize Lepton +
+ +
+
+
+
+
+
+
+
+ +

You can check for + similar problems and solutions, or open a + new topic to discuss your specific issue.

+ Visit Support + +
+
+
+
+
+
+ +

You can find content + on .NET development, cross-platform, ASP.NET + application templates, ABP-related news, and + more.

+ Visit Blog + + +
+
+
+
+
+
+
+
+ +

A unique community platform + for ABP Lovers!

+

Explore all ABP users' + experiences with the ABP Framework, discover + articles and videos on how to use ABP, and join + raffles for a chance to win surprise gifts!

+ Join ABP + Community +
+ +
+
+
+ +
+
+
+
+
More from ABP.IO
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
Latest Release Logs
+
+ + + +
+
+
Video Courses
+
+ + + +
+
+
Samples
+
+ + + +
+
+
Books
+
+ + + +
+
+
FAQ
+
+ + + +
+
+
+
+
+
+
+
+
+
+

THE OFFICIAL GUIDE

+

Mastering ABP Framework

+

Written by the creator of the ABP + Framework, this book will help you gain a complete + understanding of the framework + and modern web application development techniques.

+ +
+
+ +
+
+ +
+
+
+
+
+
+
Follow us on Social Media
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +
X.com
+
+ + + +
+ +
Discord
+
+ + + +
+ +
Stack Overflow
+
+ + + +
+ +
YouTube
+
+ + + +
+ +
Instagram
+
+ + + +
+
+
+
+
+
\ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.cs new file mode 100644 index 0000000000..3f34cebb8a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.cs @@ -0,0 +1,6 @@ +namespace Acme.BookStore.Blazor.Client.Pages; + +public partial class Index +{ + +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.css b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.css new file mode 100644 index 0000000000..2856cdaa0f --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/Index.razor.css @@ -0,0 +1,17 @@ +/* Getting-Started */ +.card-bg-image { + pointer-events: none; + position: absolute; + width: 630px; + height: auto; + bottom: 0; + right: 0; + z-index: 1; +} +.starting-content { + position: relative; + z-index: 2; +} +/* Getting-Started End */ + +/* Write here your styles for the Index page */ \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor new file mode 100644 index 0000000000..0f7c2b76ff --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor @@ -0,0 +1,111 @@ +@page "/PrivacyPolicy" +@inherits BookStoreComponentBase + +
+

Privacy Policy

+ +
+

Privacy Notice

+

+ This privacy notice for Acme.BookStore ("Company," "we," "us," or "our"), + describes how and why we might collect, store, use, and/or share ("process") your information when + you use our services ("Services"), such as when you: + +

    +
  • Visit our website, or any website of ours that links to this privacy notice
  • +
  • Engage with us in other related ways, including any sales, marketing, or events
  • +
+

+ +

+ Questions or concerns? Reading this privacy notice will help you understand your privacy rights and + choices. If you do not agree with our policies and practices, please do not use our Services. If you + still have any questions or concerns, please contact us at __________. +

+
+ +
+

Summary of Key Points

+ +

+ What personal information do we process? When you visit, use, or navigate our Services, we may + process personal information depending on how you interact with Acme.BookStore + and the Services, the choices you make, and the products and features you use. +

+ +

+ Do we process any sensitive personal information? We do not process sensitive personal + information. +

+ +

+ Do we receive any information from third parties? No, we don't. +

+ +

+ How do we process your information? We process your information to provide, improve, and + administer our Services, communicate with you, for security and fraud prevention, and to comply with + law. We may also process your information for other purposes with your consent. We process your + information only when we have a valid legal reason to do so. +

+ +

+ What are your rights? Depending on where you are located geographically, the applicable privacy + law may mean you have certain rights regarding your personal information. +

+
+ +
+

1. What Information Do We Collect?

+ +

+

Personal information you disclose to us

+ +

+ We collect personal information that you voluntarily provide to us when you register on the + Services, express an interest in obtaining information about us or our products and Services, when + you participate in activities on the Services, or otherwise when you contact us. +

+

+
+ +
+

2. HOW DO WE PROCESS YOUR INFORMATION?

+ +

+ We process your information to provide, improve, and administer our Services, + communicate with you, for security and fraud prevention, and to comply with law. We may also + process your information for other purposes with your consent. +

+
+ +
+

3. WHAT ARE YOUR PRIVACY RIGHTS?

+ +

+ In some regions, such as the European Economic Area (EEA), United Kingdom (UK), and + Canada, you have rights that allow you greater access to and control over your personal + information. You may review, change, or terminate your account at any time. +

+
+ +
+

4. HOW CAN YOU CONTACT US ABOUT THIS NOTICE?

+ +

+ If you have questions or comments about this notice, you may email us at __________. +

+
+ +
+

5. HOW CAN YOU REVIEW, UPDATE, OR DELETE THE DATA WE + COLLECT FROM YOU? +

+ +

+ Based on the applicable laws of your country, you may have the right to request access to the + personal information we collect from you, change that information, or delete it. To request to review, + or delete your personal information, please visit the personal data page. +

+
+
\ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor.cs new file mode 100644 index 0000000000..ca719b849a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/PrivacyPolicy.razor.cs @@ -0,0 +1,5 @@ +namespace Acme.BookStore.Blazor.Client.Pages; + +public partial class PrivacyPolicy +{ +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor new file mode 100644 index 0000000000..a9afc716ff --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor @@ -0,0 +1,49 @@ +@page "/Dashboard" +@using Volo.Abp.AuditLogging.Blazor.Pages.Shared.ErrorRateWidget +@using Volo.Abp.AuditLogging.Blazor.Pages.Shared.AverageExecutionDurationPerDayWidget +@using Volo.Abp.AspNetCore.Components.Web.Theming.Layout +@inherits BookStoreComponentBase + +@* ************************* PAGE HEADER ************************* *@ + + + + +@* ************************* CONTENT ************************* *@ + + + + + + + @L["Date"] + + + + + + + + + + + + + + + @if (HasAuditLoggingPermission) + { + + + + + + + } + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor.cs new file mode 100644 index 0000000000..9c60640cfc --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Pages/TenantDashboard.razor.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Volo.Abp.AuditLogging; +using Volo.Abp.AuditLogging.Blazor.Pages.Shared.AverageExecutionDurationPerDayWidget; +using Volo.Abp.AuditLogging.Blazor.Pages.Shared.ErrorRateWidget; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.BlazoriseUI; +using Volo.Abp.Timing; + +namespace Acme.BookStore.Blazor.Client.Pages; + +public partial class TenantDashboard +{ + [Inject] + public IPermissionChecker PermissionChecker { get; set; } = default!; + + protected List BreadcrumbItems = new(); + + protected AuditLoggingErrorRateWidgetComponent? ErrorRateWidgetComponent; + + protected AuditLoggingAverageExecutionDurationPerDayWidgetComponent? AverageExecutionDurationPerDayWidgetComponent; + + protected DateTime StartDate { get; set; } + + protected DateTime EndDate { get; set; } + + protected bool HasAuditLoggingPermission { get; set; } + + protected async override Task OnInitializedAsync() + { + StartDate = Clock.Now.AddMonths(-1).Date; + EndDate = Clock.Now.Date; + HasAuditLoggingPermission = await PermissionChecker.IsGrantedAsync(AbpAuditLoggingPermissions.AuditLogs.Default); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await SetBreadcrumbItemsAsync(); + await InvokeAsync(StateHasChanged); + } + } + + protected virtual async Task RefreshAsync() + { + if (HasAuditLoggingPermission) + { + if(AverageExecutionDurationPerDayWidgetComponent != null) + { + await AverageExecutionDurationPerDayWidgetComponent.RefreshAsync(); + } + if(ErrorRateWidgetComponent != null) + { + await ErrorRateWidgetComponent.RefreshAsync(); + } + } + } + + protected virtual ValueTask SetBreadcrumbItemsAsync() + { + BreadcrumbItems.Add(new BreadcrumbItem(L["Dashboard"])); + return ValueTask.CompletedTask; + } + + protected virtual Task OnDatesChangedAsync(IReadOnlyList dates) + { + StartDate = dates.Min(); + EndDate = dates.Max(); + + return Task.CompletedTask; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Program.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Program.cs new file mode 100644 index 0000000000..e4634cce81 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Program.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +namespace Acme.BookStore.Blazor.Client; + +public class Program +{ + public async static Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + + var application = await builder.AddApplicationAsync(options => + { + options.UseAutofac(); + }); + + var host = builder.Build(); + + await application.InitializeApplicationAsync(host.Services); + + await host.RunAsync(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Properties/launchSettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Properties/launchSettings.json new file mode 100644 index 0000000000..9475f81c5f --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "Acme.BookStore.Blazor.Client": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:55993;http://localhost:55994" + } + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Routes.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Routes.razor new file mode 100644 index 0000000000..be38fb7e25 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/Routes.razor @@ -0,0 +1,50 @@ +@using Microsoft.Extensions.Options +@using Microsoft.Extensions.Localization +@using global::Localization.Resources.AbpUi +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout +@using Volo.Abp.AspNetCore.Components.Web.Theming.Routing +@inject IOptions RouterOptions +@inject IOptions LayoutOptions +@inject IStringLocalizer UiLocalizer + + + + + + + @UiLocalizer["Authorizing"] + + + @if (context.User?.Identity?.IsAuthenticated != true) + { + + } + else + { + + } + + + + + + + + + + + +@code { + protected override async Task OnInitializedAsync() + { + await LayoutOptions.SetAsync(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/_Imports.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/_Imports.razor new file mode 100644 index 0000000000..7bf8fbb809 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/_Imports.razor @@ -0,0 +1,16 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.JSInterop +@using Volo.Abp.AspNetCore.Components +@using Volo.Abp.AspNetCore.Components.WebAssembly +@using Acme.BookStore.Blazor.Client +@using Blazorise +@using Blazorise.DataGrid +@using Blazorise.Components +@using Volo.Abp.BlazoriseUI +@using Volo.Abp.BlazoriseUI.Components \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.Development.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.Development.json new file mode 100644 index 0000000000..5ccf10f258 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.Development.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.json new file mode 100644 index 0000000000..0dd474f006 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/appsettings.json @@ -0,0 +1,18 @@ +{ + "App": { + "SelfUrl": "https://localhost:44352" + }, + "AuthServer": { + "Authority": "https://localhost:44330", + "ClientId": "BookStore_Blazor", + "ResponseType": "code" + }, + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44330" + }, + "AbpAccountPublic": { + "BaseUrl": "https://localhost:44330" + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/favicon.ico b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..450151f27260563a2f6adb9a987efe4cc7b82b61 GIT binary patch literal 38078 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 literal 0 HcmV?d00001 diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/icon-192.png b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..166f56da7612ea74df6a297154c8d281a4f28a14 GIT binary patch literal 2626 zcmV-I3cdA-P)v0A9xRwxP|bki~~&uFk>U z#P+PQh zyZ;-jwXKqnKbb6)@RaxQz@vm={%t~VbaZrdbaZrdbaeEeXj>~BG?&`J0XrqR#sSlO zg~N5iUk*15JibvlR1f^^1czzNKWvoJtc!Sj*G37QXbZ8LeD{Fzxgdv#Q{x}ytfZ5q z+^k#NaEp>zX_8~aSaZ`O%B9C&YLHb(mNtgGD&Kezd5S@&C=n~Uy1NWHM`t07VQP^MopUXki{2^#ryd94>UJMYW|(#4qV`kb7eD)Q=~NN zaVIRi@|TJ!Rni8J=5DOutQ#bEyMVr8*;HU|)MEKmVC+IOiDi9y)vz=rdtAUHW$yjt zrj3B7v(>exU=IrzC<+?AE=2vI;%fafM}#ShGDZx=0Nus5QHKdyb9pw&4>4XCpa-o?P(Gnco1CGX|U> z$f+_tA3+V~<{MU^A%eP!8R*-sD9y<>Jc7A(;aC5hVbs;kX9&Sa$JMG!W_BLFQa*hM zri__C@0i0U1X#?)Y=)>JpvTnY6^s;fu#I}K9u>OldV}m!Ch`d1Vs@v9 zb}w(!TvOmSzmMBa9gYvD4xocL2r0ds6%Hs>Z& z#7#o9PGHDmfG%JQq`O5~dt|MAQN@2wyJw_@``7Giyy(yyk(m8U*kk5$X1^;3$a3}N^Lp6hE5!#8l z#~NYHmKAs6IAe&A;bvM8OochRmXN>`D`{N$%#dZCRxp4-dJ?*3P}}T`tYa3?zz5BA zTu7uE#GsDpZ$~j9q=Zq!LYjLbZPXFILZK4?S)C-zE1(dC2d<7nO4-nSCbV#9E|E1MM|V<9>i4h?WX*r*ul1 z5#k6;po8z=fdMiVVz*h+iaTlz#WOYmU^SX5#97H~B32s-#4wk<1NTN#g?LrYieCu> zF7pbOLR;q2D#Q`^t%QcY06*X-jM+ei7%ZuanUTH#9Y%FBi*Z#22({_}3^=BboIsbg zR0#jJ>9QR8SnmtSS6x($?$}6$x+q)697#m${Z@G6Ujf=6iO^S}7P`q8DkH!IHd4lB zDzwxt3BHsPAcXFFY^Fj}(073>NL_$A%v2sUW(CRutd%{G`5ow?L`XYSO*Qu?x+Gzv zBtR}Y6`XF4xX7)Z04D+fH;TMapdQFFameUuHL34NN)r@aF4RO%x&NApeWGtr#mG~M z6sEIZS;Uj1HB1*0hh=O@0q1=Ia@L>-tETu-3n(op+97E z#&~2xggrl(LA|giII;RwBlX2^Q`B{_t}gxNL;iB11gEPC>v` zb4SJ;;BFOB!{chn>?cCeGDKuqI0+!skyWTn*k!WiPNBf=8rn;@y%( znhq%8fj2eAe?`A5mP;TE&iLEmQ^xV%-kmC-8mWao&EUK_^=GW-Y3z ksi~={si~={skwfB0gq6itke#r1ONa407*qoM6N<$g11Kq@c;k- literal 0 HcmV?d00001 diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/icon-512.png b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..c2dd4842dc93df73c322218ee03eca142a19a338 GIT binary patch literal 6311 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 literal 0 HcmV?d00001 diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/bg-01.png b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/bg-01.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6b323aa9572d615d559b8c4dc3c8b5507b0e65 GIT binary patch literal 27830 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%0DgFjl9gGQJQWE9+C8G;b;SMS9te zPcY83(BVp1f>k*-2Y;iX`d8`#;*|6q3M#fL@TEU1VRk*SAk_sRFckCn6a+5Zl0P=E zvN%Q>V}h+i@sKGFZ0_m2>07 zd-IHj8wS=sSIJ8R7cA^;kzl>$gRt>pLkalX+M=dY9w1y3ej>a1%YGb{r;(Zf zSP}i~0l{d5N?3J%6mWxMFi9G(;z%me?%ew7wsT#62vT6ga@N-L(>C6e3wL$TW4#Y% zW+GD}eIR2)td1VIYvjbFhMq=oAAW8l`)yOKFT{rngy{$e`@`M{M$A5*@1L%wxpn|K z8_sVB=QIc0Dvn$M<40IsPIH4nU_3Q9{;bGTr#d|VQOlK2(_$?^XcT`l`m=*h9la2K zGq_0La8xgo6VzzanJxgLE@gWc`d*&3^f`m&XiflbJCgMPI&8+4bQDT@*t{e%CWSqt zSsasjwC!vE(Dw!e{x=ACr1|3;1}xcx?lwK`?6*ZJQor6>34@ZqYA-mltSm8|dDT_) zKHjCAW8-bEK;uLNDCJk7?}Wx|4=&YCK z333g!MkUWYWO$nEP_?2lb=_gB{V}lQ-YX4p;Eoe#4%x=Ztiv#jd)o>iP}n)bctr# zg?f=YL?S^N-mpX=5UEy*In>zlsMBSi-N1DBhER6-%WMbGNVD=bFI^!G4);Pq!nC(` z1HQa3pVDDYnk+B@jgo4VjuqCHw5sUsQ&Tj-O-Zc$y~^>YJ((Qb!)3s`HOFa|M?pGKXZrQG1ZgI(E+~87Xn~QD*;j5jHyj|(asIYPwNKAs5A2}K z!Bl?g*OwAnb6J@#-n;@R$ydar1?hPTI~AhSEtJb%^n9bt%>T4Vhq=du2xxP{^P64r zK9awX4MzamptwQ@@ooqk?)&Nuj^DquCvRc+{!%|qTd7*QS}xTl)DBBAC^?!noX{z# z4uo)$soKkz^0Fi9%}b+!GU@i{u-ac)(+6d(pkMT7tT87|ZSd_}2|vl}>^ZMu;$@TJ zD*&!TX_tlfo^ge9X{v9BuD8v7Vkuj(gL1L*amc}qrdIY<)>Ol`dhbN6sDb!qmq zHgYp`>j(3ef(~R&5aU_pv5LmCfy@#-<2>4F$3rj<8x|uM6>ZJVAIbmuSooj*J>d)kl%+0*_EhHFi z_i>#%wi7maG!9pFuZDOF<`1mEiuxpWV(wis_soOSuVWGL%OV3U-%AUm_?v5VL9EFf zaytik%Bnu-9<35BzGY!n__7Y{0gxUqx!3O4T2hl`Aaj$7-pUdCPCxhr+B`AV{hz7BJ`lwBp$&Yy%_^@^g*`LcGM!Q<;rR2NIjm56}5E#*OaGx!Bku|Ea}G>gvHWjQ`VkG#vUK>E*ucfA>^dD`hM|-`czF5a zdD}<00__M7!6KN6IuCS(e!d>N)MW|fs;FOIjf;13;x$1r3P%xqGPIlI!*DC(`H{Y| zJP^O8mMkehHOa)c-W$E*l#E1>7E~mHhfYD4I94~0qf|rmhWr-Z)yUdSu zdyCFPnA3mUWKi1scFoQhV(#e>s~rfmO05Km4IiXHHd~#^Zps7GH#$=pc_rhZlh{AI zhcqOJ8DcdaGA;2S2WGl*M?!vx(4L3uZqFl+N&6^*t8Du5j*PsW$OP+_IT9l25&25A z1a;QV?TDPQ=2&J?Xqa)sX%Qpo;qC5bh6t#55f+O~%Q3cG?bQ7zF_bYMq4RVeb|v12 z

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 z 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

uCa*26FF~|Zlkjl#xEm_dJ*dY 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%0DbBoo1p9gWu$#S;P0wxN<0sa#78*oPc*s6wVQ$ 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 + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-blog.png b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-blog.png new file mode 100644 index 0000000000000000000000000000000000000000..37fc5be0e03e6d59a60d559d74d6fdfa51e10482 GIT binary patch literal 42029 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 literal 0 HcmV?d00001 diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-support.png b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/img-support.png new file mode 100644 index 0000000000000000000000000000000000000000..27f4f13b22c1036c269b6e2b17d29e287e2ef26a GIT binary patch literal 33989 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 StuUzo0000 + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg new file mode 100644 index 0000000000..8e3e3da937 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/x-white.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/x-white.svg new file mode 100644 index 0000000000..56acc94cb0 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/x-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/youtube.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/youtube.svg new file mode 100644 index 0000000000..0cf6944857 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/getting-started/youtube.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/icon.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/icon.svg new file mode 100644 index 0000000000..57c7d0dec5 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-dark.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-dark.svg new file mode 100644 index 0000000000..1e77f6b8ed --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-light.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-light.svg new file mode 100644 index 0000000000..0d896a5ce0 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/images/logo/leptonx/logo-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/main.css b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/main.css new file mode 100644 index 0000000000..bbd849d3c9 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/main.css @@ -0,0 +1,42 @@ +/* + loader +*/ +.loader { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100vw; + height: 100vh; + z-index: 999; + background-color: #f1f1f2; + } + +#ApplicationContainer > div:first-child:not(:only-child) { + display: none !important; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + +:root { + --lpx-logo: url('/images/logo/leptonx/icon.svg'); + --lpx-logo-icon: url('/images/logo/leptonx/icon.svg'); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/manifest.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/manifest.json new file mode 100644 index 0000000000..92fc822742 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "BookStore", + "short_name": "Acme.BookStore", + "start_url": "./", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#03173d", + "prefer_related_applications": false, + "icons": [ + { + "src": "icon-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "icon-192.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.js b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.js new file mode 100644 index 0000000000..c6d008594d --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.js @@ -0,0 +1,4 @@ +// In development, always fetch from the network and do not enable offline support. +// This is because caching would make development more difficult (changes would not +// be reflected on the first load after each change). +self.addEventListener('fetch', () => { }); diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.published.js b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.published.js new file mode 100644 index 0000000000..105b7138e8 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor.Client/wwwroot/service-worker.published.js @@ -0,0 +1,48 @@ +// Caution! Be sure you understand the caveats before publishing an application with +// offline support. See https://aka.ms/blazor-offline-considerations + +self.importScripts('./service-worker-assets.js'); +self.addEventListener('install', event => event.waitUntil(onInstall(event))); +self.addEventListener('activate', event => event.waitUntil(onActivate(event))); +self.addEventListener('fetch', event => event.respondWith(onFetch(event))); + +const cacheNamePrefix = 'offline-cache-'; +const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; +const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ]; +const offlineAssetsExclude = [ /^service-worker\.js$/ ]; + +async function onInstall(event) { + console.info('Service worker: Install'); + + // Fetch and cache all matching items from the assets manifest + const assetsRequests = self.assetsManifest.assets + .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) + .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) + .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); + await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); +} + +async function onActivate(event) { + console.info('Service worker: Activate'); + + // Delete unused caches + const cacheKeys = await caches.keys(); + await Promise.all(cacheKeys + .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) + .map(key => caches.delete(key))); +} + +async function onFetch(event) { + let cachedResponse = null; + if (event.request.method === 'GET') { + // For all navigation requests, try to serve index.html from cache + // If you need some URLs to be server-rendered, edit the following check to exclude those URLs + const shouldServeIndexHtml = event.request.mode === 'navigate'; + + const request = shouldServeIndexHtml ? 'index.html' : event.request; + const cache = await caches.open(cacheName); + cachedResponse = await cache.match(request); + } + + return cachedResponse || fetch(event.request); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.abppkg new file mode 100644 index 0000000000..ad6b97ea1a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.abppkg @@ -0,0 +1,3 @@ +{ + "role": "host.blazor-wasm" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj index 8fdadc4408..08aa6cee32 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Acme.BookStore.Blazor.csproj @@ -1,56 +1,30 @@ - - - - - - net8.0 - true - true - true - false - true - Acme.BookStore-4681b4fd-151f-4221-84a4-929d86723e4c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - - - - + + + + + + net9.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorModule.cs index ef2b5f2ab5..e77e3603fe 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBlazorModule.cs @@ -1,248 +1,88 @@ -using System.IO; -using Blazorise.Bootstrap5; -using Blazorise.Icons.FontAwesome; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Extensions.DependencyInjection; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.OpenApi.Models; -using Acme.BookStore.Blazor.Menus; -using Acme.BookStore.EntityFrameworkCore; -using Acme.BookStore.Localization; -using Acme.BookStore.MultiTenancy; -using OpenIddict.Validation.AspNetCore; -using Volo.Abp; -using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme; -using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling; -using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.Localization; -using Volo.Abp.AspNetCore.Mvc.UI; -using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; -using Volo.Abp.AspNetCore.Mvc.UI.Bundling; -using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; -using Volo.Abp.AspNetCore.Serilog; -using Volo.Abp.Autofac; -using Volo.Abp.AutoMapper; -using Volo.Abp.Identity.Blazor.Server; -using Volo.Abp.Localization; -using Volo.Abp.Modularity; -using Volo.Abp.SettingManagement.Blazor.Server; -using Volo.Abp.Swashbuckle; -using Volo.Abp.TenantManagement.Blazor.Server; -using Volo.Abp.UI; -using Volo.Abp.UI.Navigation; -using Volo.Abp.UI.Navigation.Urls; -using Volo.Abp.VirtualFileSystem; - -namespace Acme.BookStore.Blazor; - -[DependsOn( - typeof(BookStoreApplicationModule), - typeof(BookStoreEntityFrameworkCoreModule), - typeof(BookStoreHttpApiModule), - typeof(AbpAutofacModule), - typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreSerilogModule), - typeof(AbpAccountWebOpenIddictModule), - typeof(AbpAspNetCoreComponentsServerLeptonXLiteThemeModule), - typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), - typeof(AbpIdentityBlazorServerModule), - typeof(AbpTenantManagementBlazorServerModule), - typeof(AbpSettingManagementBlazorServerModule) - )] -public class BookStoreBlazorModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - context.Services.PreConfigure(options => - { - options.AddAssemblyResource( - typeof(BookStoreResource), - typeof(BookStoreDomainModule).Assembly, - typeof(BookStoreDomainSharedModule).Assembly, - typeof(BookStoreApplicationModule).Assembly, - typeof(BookStoreApplicationContractsModule).Assembly, - typeof(BookStoreBlazorModule).Assembly - ); - }); - - PreConfigure(builder => - { - builder.AddValidation(options => - { - options.AddAudiences("BookStore"); - options.UseLocalServer(); - options.UseAspNetCore(); - }); - }); - } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - var hostingEnvironment = context.Services.GetHostingEnvironment(); - var configuration = context.Services.GetConfiguration(); - - ConfigureAuthentication(context); - ConfigureUrls(configuration); - ConfigureBundles(); - ConfigureAutoMapper(); - ConfigureVirtualFileSystem(hostingEnvironment); - ConfigureSwaggerServices(context.Services); - ConfigureAutoApiControllers(); - ConfigureBlazorise(context); - ConfigureRouter(context); - ConfigureMenu(context); - } - - private void ConfigureAuthentication(ServiceConfigurationContext context) - { - context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); - } - - private void ConfigureUrls(IConfiguration configuration) - { - Configure(options => - { - options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); - }); - } - - private void ConfigureBundles() - { - Configure(options => - { - // MVC UI - options.StyleBundles.Configure( - LeptonXLiteThemeBundles.Styles.Global, - bundle => - { - bundle.AddFiles("/global-styles.css"); - } - ); - - //BLAZOR UI - options.StyleBundles.Configure( - BlazorLeptonXLiteThemeBundles.Styles.Global, - bundle => - { - bundle.AddFiles("/blazor-global-styles.css"); - //You can remove the following line if you don't use Blazor CSS isolation for components - bundle.AddFiles("/Acme.BookStore.Blazor.styles.css"); - } - ); - }); - } - - private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment) - { - if (hostingEnvironment.IsDevelopment()) - { - Configure(options => - { - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Domain.Shared")); - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Domain")); - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Application.Contracts")); - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Application")); - options.FileSets.ReplaceEmbeddedByPhysical(hostingEnvironment.ContentRootPath); - }); - } - } - - private void ConfigureSwaggerServices(IServiceCollection services) - { - services.AddAbpSwaggerGen( - options => - { - options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookStore API", Version = "v1" }); - options.DocInclusionPredicate((docName, description) => true); - options.CustomSchemaIds(type => type.FullName); - } - ); - } - - private void ConfigureBlazorise(ServiceConfigurationContext context) - { - context.Services - .AddBootstrap5Providers() - .AddFontAwesomeIcons(); - } - - private void ConfigureMenu(ServiceConfigurationContext context) - { - Configure(options => - { - options.MenuContributors.Add(new BookStoreMenuContributor()); - }); - } - - private void ConfigureRouter(ServiceConfigurationContext context) - { - Configure(options => - { - options.AppAssembly = typeof(BookStoreBlazorModule).Assembly; - }); - } - - private void ConfigureAutoApiControllers() - { - Configure(options => - { - options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly); - }); - } - - private void ConfigureAutoMapper() - { - Configure(options => - { - options.AddMaps(); - }); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - var env = context.GetEnvironment(); - var app = context.GetApplicationBuilder(); - - app.UseAbpRequestLocalization(); - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - app.UseHsts(); - } - - app.UseHttpsRedirection(); - app.UseCorrelationId(); - app.UseStaticFiles(); - app.UseRouting(); - app.UseAuthentication(); - app.UseAbpOpenIddictValidation(); - - if (MultiTenancyConsts.IsEnabled) - { - app.UseMultiTenancy(); - } - - app.UseUnitOfWork(); - app.UseAuthorization(); - app.UseSwagger(); - app.UseAbpSwaggerUI(options => - { - options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookStore API"); - }); - app.UseConfiguredEndpoints(); - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Acme.BookStore.Blazor.Components; +using Acme.BookStore.Blazor.Client; +using Volo.Abp; +using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.Libs; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; +using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling; +using Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme.Bundling; +using Volo.Abp.Account.Pro.Public.Blazor.WebAssembly.Bundling; +using Volo.Abp.AuditLogging.Blazor.WebAssembly.Bundling; +using Volo.Saas.Host.Blazor.WebAssembly.Bundling; + +namespace Acme.BookStore.Blazor; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeBundlingModule), + typeof(AbpAccountPublicBlazorWebAssemblyBundlingModule), + typeof(SaasHostBlazorWebAssemblyBundlingModule), + typeof(AbpAuditLoggingBlazorWebAssemblyBundlingModule), + typeof(AbpAspNetCoreMvcUiBundlingModule) +)] +public class BookStoreBlazorModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + //https://github.com/dotnet/aspnetcore/issues/52530 + Configure(options => + { + options.SuppressCheckForUnhandledSecurityMetadata = true; + }); + + // Add services to the container. + context.Services.AddRazorComponents() + .AddInteractiveWebAssemblyComponents(); + + Configure(options => + { + options.CheckLibs = false; + }); + + Configure(options => + { + var globalStyles = options.StyleBundles.Get(BlazorWebAssemblyStandardBundles.Styles.Global); + globalStyles.AddContributors(typeof(BookStoreStyleBundleContributor)); + + var globalScripts = options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global); + globalScripts.AddContributors(typeof(BookStoreScriptBundleContributor)); + + options.Parameters["LeptonXTheme.Layout"] = "side-menu"; // side-menu or top-menu + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var env = context.GetEnvironment(); + var app = context.GetApplicationBuilder(); + + // Configure the HTTP request pipeline. + if (env.IsDevelopment()) + { + app.UseWebAssemblyDebugging(); + } + else + { + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseRouting(); + app.MapAbpStaticAssets(); + app.UseAntiforgery(); + + app.UseConfiguredEndpoints(builder => + { + builder.MapRazorComponents() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(WebAppAdditionalAssembliesHelper.GetAssemblies()); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBrandingProvider.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBrandingProvider.cs deleted file mode 100644 index 4a52b4439f..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreBrandingProvider.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Volo.Abp.DependencyInjection; -using Volo.Abp.Ui.Branding; - -namespace Acme.BookStore.Blazor; - -[Dependency(ReplaceServices = true)] -public class BookStoreBrandingProvider : DefaultBrandingProvider -{ - public override string AppName => "BookStore"; -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreScriptBundleContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreScriptBundleContributor.cs new file mode 100644 index 0000000000..748e7970eb --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreScriptBundleContributor.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Acme.BookStore.Blazor; + +public class BookStoreScriptBundleContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreStyleBundleContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreStyleBundleContributor.cs new file mode 100644 index 0000000000..0026039f68 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/BookStoreStyleBundleContributor.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Acme.BookStore.Blazor; + +public class BookStoreStyleBundleContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add(new BundleFile("main.css", true)); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Components/App.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Components/App.razor new file mode 100644 index 0000000000..6a926b1a49 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Components/App.razor @@ -0,0 +1,38 @@ + + + + + + + Acme + + + + + + + + + + + + + + + + +

+ + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile new file mode 100644 index 0000000000..f6a2ab8fca --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile @@ -0,0 +1,5 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 +COPY bin/Release/net9.0/publish/ app/ +WORKDIR /app +ENV ASPNETCORE_URLS=http://+:80 +ENTRYPOINT ["dotnet", "Acme.BookStore.Blazor.dll"] \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile.local b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile.local new file mode 100644 index 0000000000..7c1324b0ce --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Dockerfile.local @@ -0,0 +1,8 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS build +USER $APP_UID +EXPOSE 8080 +EXPOSE 8081 + +COPY bin/Release/net9.0/publish/ app/ +WORKDIR /app +ENTRYPOINT ["dotnet", "Acme.BookStore.Blazor.dll"] \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenuContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenuContributor.cs deleted file mode 100644 index 1ad402dc7c..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenuContributor.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Acme.BookStore.Localization; -using Acme.BookStore.Permissions; -using System.Threading.Tasks; -using Volo.Abp.UI.Navigation; - -namespace Acme.BookStore.Blazor.Menus; - -public class BookStoreMenuContributor : IMenuContributor -{ - public async Task ConfigureMenuAsync(MenuConfigurationContext context) - { - if (context.Menu.Name == StandardMenus.Main) - { - await ConfigureMainMenuAsync(context); - } - } - - private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) - { - var l = context.GetLocalizer(); - - context.Menu.Items.Insert( - 0, - new ApplicationMenuItem( - "BookStore.Home", - l["Menu:Home"], - "/", - icon: "fas fa-home" - ) - ); - - var bookStoreMenu = new ApplicationMenuItem( - "BooksStore", - l["Menu:BookStore"], - icon: "fa fa-book" - ); - - context.Menu.AddItem(bookStoreMenu); - - //CHECK the PERMISSION - if (await context.IsGrantedAsync(BookStorePermissions.Books.Default)) - { - bookStoreMenu.AddItem(new ApplicationMenuItem( - "BooksStore.Books", - l["Menu:Books"], - url: "/books" - )); - } - - if (await context.IsGrantedAsync(BookStorePermissions.Authors.Default)) - { - bookStoreMenu.AddItem(new ApplicationMenuItem( - "BooksStore.Authors", - l["Menu:Authors"], - url: "/authors" - )); - } - - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenus.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenus.cs deleted file mode 100644 index 0cae7f3b05..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Menus/BookStoreMenus.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Acme.BookStore.Blazor.Menus; - -public class BookStoreMenus -{ - private const string Prefix = "BookStore"; - public const string Home = Prefix + ".Home"; - - //Add your menu items here... - -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Books.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Books.razor deleted file mode 100644 index 82152dc884..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Books.razor +++ /dev/null @@ -1,257 +0,0 @@ -@page "/books" -@attribute [Authorize(BookStorePermissions.Books.Default)] -@using Acme.BookStore.Permissions -@using Microsoft.AspNetCore.Authorization -@using Volo.Abp.Application.Dtos -@using Acme.BookStore.Books -@using Acme.BookStore.Localization -@using Microsoft.Extensions.Localization -@using Volo.Abp -@using Volo.Abp.AspNetCore.Components.Web -@inject IStringLocalizer L -@inject AbpBlazorMessageLocalizerHelper LH -@inherits AbpCrudPageBase - - - - - -

@L["Books"]

-
- - @if (HasCreatePermission) - { - - } - -
-
- - - - - - - - - - - - - - - - @L[$"Enum:BookType.{context.Type}"] - - - - - @context.PublishDate.ToShortDateString() - - - - - - - @context.CreationTime.ToLongDateString() - - - - - -
- - - - -
- - @L["NewBook"] - - - - - - - @L["Author"] - - - - @L["Name"] - - - - - - - - - @L["Type"] - - - - @L["PublishDate"] - - - - @L["Price"] - - - - - - - - -
-
-
- - - - -
- - @EditingEntity.Name - - - - - - - @L["Author"] - - - - @L["Name"] - - - - - - - - - @L["Type"] - - - - @L["PublishDate"] - - - - @L["Price"] - - - - - - - - -
-
-
- -@code -{ - //ADDED A NEW FIELD - IReadOnlyList authorList = Array.Empty(); - - public Books() // Constructor - { - CreatePolicyName = BookStorePermissions.Books.Create; - UpdatePolicyName = BookStorePermissions.Books.Edit; - DeletePolicyName = BookStorePermissions.Books.Delete; - } - - //GET AUTHORS ON INITIALIZATION - protected override async Task OnInitializedAsync() - { - await base.OnInitializedAsync(); - authorList = (await AppService.GetAuthorLookupAsync()).Items; - } - - protected override async Task OpenCreateModalAsync() - { - if (!authorList.Any()) - { - throw new UserFriendlyException(message: L["AnAuthorIsRequiredForCreatingBook"]); - } - - await base.OpenCreateModalAsync(); - NewEntity.AuthorId = authorList.First().Id; - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor deleted file mode 100644 index 3f0c50de70..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor +++ /dev/null @@ -1,177 +0,0 @@ -@page "/" -@using Volo.Abp.MultiTenancy -@inherits BookStoreComponentBase -@inject AuthenticationStateProvider AuthenticationStateProvider -
diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.cs deleted file mode 100644 index bad23d254f..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Acme.BookStore.Blazor.Pages; - -public partial class Index -{ - -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.css b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.css deleted file mode 100644 index b154964e8a..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/Index.razor.css +++ /dev/null @@ -1 +0,0 @@ -/* Write here your styles for the Index page */ \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_Host.cshtml b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_Host.cshtml deleted file mode 100644 index c489437239..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_Host.cshtml +++ /dev/null @@ -1,39 +0,0 @@ -@page "/" -@namespace Acme.BookStore.Blazor.Pages -@using System.Globalization -@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite -@using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling -@using Volo.Abp.Localization -@{ - Layout = null; - var rtl = CultureHelper.IsRtl ? "rtl" : string.Empty; -} - - - - - - - Acme.BookStore.Blazor - - - - - - - - -
- - An error has occurred. This application may no longer respond until reloaded. - - - An unhandled exception has occurred. See browser dev tools for details. - - Reload - 🗙 -
- - - - diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Program.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Program.cs index 413161bc1a..762c9844ba 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Program.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Program.cs @@ -1,51 +1,56 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Serilog; -using Serilog.Events; - -namespace Acme.BookStore.Blazor; - -public class Program -{ - public async static Task Main(string[] args) - { - Log.Logger = new LoggerConfiguration() -#if DEBUG - .MinimumLevel.Debug() -#else - .MinimumLevel.Information() -#endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) - .WriteTo.Async(c => c.Console()) - .CreateLogger(); - - try - { - Log.Information("Starting web host."); - var builder = WebApplication.CreateBuilder(args); - builder.Host.AddAppSettingsSecretsJson() - .UseAutofac() - .UseSerilog(); - await builder.AddApplicationAsync(); - var app = builder.Build(); - await app.InitializeApplicationAsync(); - await app.RunAsync(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } -} +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Acme.BookStore.Blazor; +using Serilog; +using Serilog.Events; + +namespace Acme.BookStore.Blazor; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() +#if DEBUG + .MinimumLevel.Debug() +#else + .MinimumLevel.Information() +#endif + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + try + { + Log.Information("Starting web host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.AddApplicationAsync(); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); + return 0; + } + catch (Exception ex) + { + if (ex is HostAbortedException) + { + throw; + } + + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Properties/launchSettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Properties/launchSettings.json index 2030eca211..44fa47ad00 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Properties/launchSettings.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Properties/launchSettings.json @@ -1,28 +1,29 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "https://localhost:44380/", - "sslPort": 44380 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Acme.BookStore.Blazor": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": true, - "applicationUrl": "https://localhost:44380/", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44352", + "sslPort": 44352 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Acme.BookStore.Blazor": { + "commandName": "Project", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:44352", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/_Imports.razor b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/_Imports.razor index 9b3ed40630..53076713c2 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/_Imports.razor +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/_Imports.razor @@ -1,13 +1,10 @@ -@using System.Net.Http -@using Microsoft.AspNetCore.Authorization -@using Microsoft.AspNetCore.Components.Authorization -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.JSInterop -@using Acme.BookStore.Blazor -@using Blazorise -@using Blazorise.DataGrid -@using Volo.Abp.BlazoriseUI -@using Volo.Abp.BlazoriseUI.Components \ No newline at end of file +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using Acme.BookStore.Blazor.Client.Components +@using Acme.BookStore.Blazor.Client \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.json deleted file mode 100644 index cf9602de1d..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "App": { - "SelfUrl": "https://localhost:44380", - "RedirectAllowedUrls": "https://localhost:44380" - }, - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=BookStore;Trusted_Connection=True;TrustServerCertificate=True" - }, - "AuthServer": { - "Authority": "https://localhost:44380", - "RequireHttpsMetadata": "false" - }, - "StringEncryption": { - "DefaultPassPhrase": "OWTs3ez2uJdq0443" - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.secrets.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.secrets.json deleted file mode 100644 index 7a73a41bfd..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.secrets.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package-lock.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package-lock.json deleted file mode 100644 index d671d9a1ea..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package-lock.json +++ /dev/null @@ -1,3196 +0,0 @@ -{ - "name": "my-app", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@abp/aspnetcore.mvc.ui": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz", - "integrity": "sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==", - "requires": { - "ansi-colors": "^4.1.1", - "extend-object": "^1.0.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "gulp": "^4.0.2", - "merge-stream": "^2.0.0", - "micromatch": "^4.0.2", - "path": "^0.12.7" - } - }, - "@abp/aspnetcore.mvc.ui.theme.basic": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.1.tgz", - "integrity": "sha512-Tb0g4mtdSsjQkadvnjjRjObEhweUvigto0BTv5SzRNi0oQLW8ZVUcFmuMWB09nJAIPrbuA3QuPUlXzFcv2gsdg==", - "requires": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~4.2.1" - } - }, - "@abp/aspnetcore.mvc.ui.theme.shared": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz", - "integrity": "sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==", - "requires": { - "@abp/aspnetcore.mvc.ui": "~4.2.1", - "@abp/bootstrap": "~4.2.1", - "@abp/bootstrap-datepicker": "~4.2.1", - "@abp/datatables.net-bs4": "~4.2.1", - "@abp/font-awesome": "~4.2.1", - "@abp/jquery-form": "~4.2.1", - "@abp/jquery-validation-unobtrusive": "~4.2.1", - "@abp/lodash": "~4.2.1", - "@abp/luxon": "~4.2.1", - "@abp/malihu-custom-scrollbar-plugin": "~4.2.1", - "@abp/select2": "~4.2.1", - "@abp/sweetalert": "~4.2.1", - "@abp/timeago": "~4.2.1", - "@abp/toastr": "~4.2.1" - } - }, - "@abp/bootstrap": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-4.2.1.tgz", - "integrity": "sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==", - "requires": { - "@abp/core": "~4.2.1", - "bootstrap": "^4.5.0", - "bootstrap-v4-rtl": "4.4.1-2" - } - }, - "@abp/bootstrap-datepicker": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz", - "integrity": "sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==", - "requires": { - "bootstrap-datepicker": "^1.9.0" - } - }, - "@abp/core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/core/-/core-4.2.1.tgz", - "integrity": "sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==", - "requires": { - "@abp/utils": "^4.2.1" - } - }, - "@abp/datatables.net": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-4.2.1.tgz", - "integrity": "sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==", - "requires": { - "@abp/jquery": "~4.2.1", - "datatables.net": "^1.10.21" - } - }, - "@abp/datatables.net-bs4": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz", - "integrity": "sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==", - "requires": { - "@abp/datatables.net": "~4.2.1", - "datatables.net-bs4": "^1.10.21" - } - }, - "@abp/font-awesome": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-4.2.1.tgz", - "integrity": "sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==", - "requires": { - "@abp/core": "~4.2.1", - "@fortawesome/fontawesome-free": "^5.13.0" - } - }, - "@abp/jquery": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/jquery/-/jquery-4.2.1.tgz", - "integrity": "sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==", - "requires": { - "@abp/core": "~4.2.1", - "jquery": "~3.5.1" - }, - "dependencies": { - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - } - } - }, - "@abp/jquery-form": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/jquery-form/-/jquery-form-4.2.1.tgz", - "integrity": "sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==", - "requires": { - "@abp/jquery": "~4.2.1", - "jquery-form": "^4.3.0" - } - }, - "@abp/jquery-validation": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz", - "integrity": "sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==", - "requires": { - "@abp/jquery": "~4.2.1", - "jquery-validation": "^1.19.2" - } - }, - "@abp/jquery-validation-unobtrusive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz", - "integrity": "sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==", - "requires": { - "@abp/jquery-validation": "~4.2.1", - "jquery-validation-unobtrusive": "^3.2.11" - } - }, - "@abp/lodash": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/lodash/-/lodash-4.2.1.tgz", - "integrity": "sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==", - "requires": { - "@abp/core": "~4.2.1", - "lodash": "^4.17.15" - } - }, - "@abp/luxon": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/luxon/-/luxon-4.2.1.tgz", - "integrity": "sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==", - "requires": { - "@abp/core": "~4.2.1", - "luxon": "^1.24.1" - } - }, - "@abp/malihu-custom-scrollbar-plugin": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz", - "integrity": "sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==", - "requires": { - "@abp/core": "~4.2.1", - "malihu-custom-scrollbar-plugin": "^3.1.5" - } - }, - "@abp/select2": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/select2/-/select2-4.2.1.tgz", - "integrity": "sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==", - "requires": { - "@abp/core": "~4.2.1", - "select2": "^4.0.13" - } - }, - "@abp/sweetalert": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/sweetalert/-/sweetalert-4.2.1.tgz", - "integrity": "sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==", - "requires": { - "@abp/core": "~4.2.1", - "sweetalert": "^2.1.2" - } - }, - "@abp/timeago": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/timeago/-/timeago-4.2.1.tgz", - "integrity": "sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==", - "requires": { - "@abp/jquery": "~4.2.1", - "timeago": "^1.6.7" - } - }, - "@abp/toastr": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/toastr/-/toastr-4.2.1.tgz", - "integrity": "sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==", - "requires": { - "@abp/jquery": "~4.2.1", - "toastr": "^2.1.4" - } - }, - "@abp/utils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@abp/utils/-/utils-4.2.1.tgz", - "integrity": "sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==", - "requires": { - "just-compare": "^1.3.0" - } - }, - "@fortawesome/fontawesome-free": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.2.tgz", - "integrity": "sha512-7l/AX41m609L/EXI9EKH3Vs3v0iA8tKlIOGtw+kgcoanI7p+e4I4GYLqW3UXWiTnjSFymKSmTTPKYrivzbxxqA==" - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "requires": { - "async-done": "^1.2.2" - } - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bootstrap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", - "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" - }, - "bootstrap-datepicker": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz", - "integrity": "sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==", - "requires": { - "jquery": ">=1.7.1 <4.0.0" - } - }, - "bootstrap-v4-rtl": { - "version": "4.4.1-2", - "resolved": "https://registry.npmjs.org/bootstrap-v4-rtl/-/bootstrap-v4-rtl-4.4.1-2.tgz", - "integrity": "sha512-x9jZLEQzeOlkfxnR73aE/LjTD6hlqU6BbKVKdGasDByEP7dHBaxYaDGX54pfpHTom2QFqQ3t6y0WkDZW6DrQhw==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "datatables.net": { - "version": "1.10.23", - "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.23.tgz", - "integrity": "sha512-we3tlNkzpxvgkKKlTxTMXPCt35untVXNg8zUYWpQyC1U5vJc+lT0+Zdc1ztK8d3lh5CfdnuFde2p8n3XwaGl3Q==", - "requires": { - "jquery": ">=1.7" - } - }, - "datatables.net-bs4": { - "version": "1.10.23", - "resolved": "https://registry.npmjs.org/datatables.net-bs4/-/datatables.net-bs4-1.10.23.tgz", - "integrity": "sha512-ChUB8t5t5uzPnJYTPXx2DOvnlm2shz8OadXrKoFavOadB308OuwHVxSldYq9+KGedCeiVxEjNqcaV4nFSXkRsw==", - "requires": { - "datatables.net": "1.10.23", - "jquery": ">=1.7" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.3.0.tgz", - "integrity": "sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extend-object/-/extend-object-1.0.0.tgz", - "integrity": "sha1-QlFPhAFdE1bK9Rh5ad+yvBvaCCM=" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", - "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "jquery-form": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jquery-form/-/jquery-form-4.3.0.tgz", - "integrity": "sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ==", - "requires": { - "jquery": ">=1.7.2" - } - }, - "jquery-mousewheel": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", - "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=" - }, - "jquery-validation": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.19.3.tgz", - "integrity": "sha512-iXxCS5W7STthSTMFX/NDZfWHBLbJ1behVK3eAgHXAV8/0vRa9M4tiqHvJMr39VGWHMGdlkhrtrkBuaL2UlE8yw==" - }, - "jquery-validation-unobtrusive": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.12.tgz", - "integrity": "sha512-kPixGhVcuat7vZXngGFfSIksy4VlzZcHyRgnBIZdsfVneCU+D5sITC8T8dD/9c9K/Q+qkMlgp7ufJHz93nKSuQ==", - "requires": { - "jquery": "^3.5.1", - "jquery-validation": ">=1.16" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "just-compare": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/just-compare/-/just-compare-1.3.0.tgz", - "integrity": "sha512-i4QNo3mPYubDmAwPbCKQl5C2b5s0yudP5V5GDp6lGR1PM22Em4Idf7mcaIzXYcL6/RLdZtuGrAqkBe9RYM/t4w==" - }, - "just-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", - "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "luxon": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz", - "integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "malihu-custom-scrollbar-plugin": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz", - "integrity": "sha1-MQzsxeWUFaHCnp37XStuAdZqKe8=", - "requires": { - "jquery-mousewheel": ">=3.0.6" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" - }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "requires": { - "once": "^1.3.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise-polyfill": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", - "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=" - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "select2": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz", - "integrity": "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "requires": { - "sver-compat": "^1.5.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "sweetalert": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/sweetalert/-/sweetalert-2.1.2.tgz", - "integrity": "sha512-iWx7X4anRBNDa/a+AdTmvAzQtkN1+s4j/JJRWlHpYE8Qimkohs8/XnFcWeYHH2lMA8LRCa5tj2d244If3S/hzA==", - "requires": { - "es6-object-assign": "^1.1.0", - "promise-polyfill": "^6.0.2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "timeago": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz", - "integrity": "sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ==", - "requires": { - "jquery": ">=1.5.0 <4.0" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "requires": { - "through2": "^2.0.3" - } - }, - "toastr": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", - "integrity": "sha1-i0O+ZPudDEFIcURvLbjoyk6V8YE=", - "requires": { - "jquery": ">=1.12.0" - } - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "undertaker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", - "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "fast-levenshtein": "^1.0.0", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" - } - }, - "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package.json deleted file mode 100644 index d73ab67460..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "version": "1.0.0", - "name": "my-app", - "private": true, - "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~3.3.0", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~3.3.0" - } -} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/blazor-global-styles.css b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/blazor-global-styles.css deleted file mode 100644 index 0d26cfc24f..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/blazor-global-styles.css +++ /dev/null @@ -1,18 +0,0 @@ -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - -#blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/favicon.ico b/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/wwwroot/favicon.ico deleted file mode 100644 index a3a799985c43bc7309d701b2cad129023377dc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 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.4.0 <4.0.0" - -bootstrap-daterangepicker@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8" - integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g== - dependencies: - jquery ">=1.10" - moment "^2.9.0" - -bootstrap@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" - integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== - -datatables.net-bs5@^2.0.8: - version "2.1.6" - resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.1.6.tgz#863c75472981d2cfad66f3cfd24e3c7da46986d6" - integrity sha512-GLp98kE2lJI6cBgLaCA1he+KhD3pcVJLK4QU8oD3Zb8uHAduX0BA2JPndFZqXJs4CS0L16fel8Xs3+0wGzFxSg== - dependencies: - datatables.net "2.1.6" - jquery ">=1.7" - -datatables.net@2.1.6, datatables.net@^2.0.8: - version "2.1.6" - resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.1.6.tgz#563a7fb2ae206a60a83ec0aba011ce7e75a65d1f" - integrity sha512-ziX0Wz91oDJ4o7gQNuGxQiVK91OUu/bRcXyxa6EZtDwLObmaGKpkCNS59QpzrGtIytQIVFtLfF1EDdYid5RVog== - dependencies: - jquery ">=1.7" - -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - -jquery-mousewheel@>=3.0.6: - version "3.1.13" - resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== - -jquery-validation-unobtrusive@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#dfcf25a558496a2c883db6021d10f5398d15f99d" - integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ== - dependencies: - jquery "^3.6.0" - jquery-validation ">=1.19" - -jquery-validation@>=1.19, jquery-validation@^1.20.1: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" - integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== - -jquery@>=1.10, jquery@>=1.12.0, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: - version "3.6.3" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.3.tgz#23ed2ffed8a19e048814f13391a19afcdba160e6" - integrity sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg== - -"jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" - integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== - -just-compare@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-2.3.0.tgz#a2adcc1d1940536263275f5a1ef1298bcacfeda7" - integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -luxon@^3.4.4: - version "3.5.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" - integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== - -malihu-custom-scrollbar-plugin@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef" - integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ== - dependencies: - jquery-mousewheel ">=3.0.6" - -moment@^2.30.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - -moment@^2.9.0: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -select2@^4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d" - integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw== - -sweetalert2@^11.3.6: - version "11.6.16" - resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.6.16.tgz#ed3062b4b06a5dc81bb4fe4f245ff8b9e432b2d8" - integrity sha512-T2FO8LptErsjE4r0WMfiSk4YbeUvPadNaUZ/cADMEOnws000znrf8zFX9S5e/spvzJDyRI5En73WQyDZhGypxQ== - -timeago@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5" - integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ== - dependencies: - jquery ">=1.5.0 <4.0" - -toastr@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/toastr/-/toastr-2.1.4.tgz#8b43be64fb9d0c414871446f2db8e8ca4e95f181" - integrity sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA== - dependencies: - jquery ">=1.12.0" diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.abppkg new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.abppkg @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj index fc19161e9d..c7d2a70301 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj @@ -1,44 +1,46 @@ - - - - - - Exe - net8.0 - - - - - - PreserveNewest - Always - - - - PreserveNewest - Always - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + Exe + net9.0 + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + Always + + + + PreserveNewest + Always + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs index f3d30a30f1..a726609b2b 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs @@ -1,15 +1,14 @@ -using Acme.BookStore.EntityFrameworkCore; -using Volo.Abp.Autofac; -using Volo.Abp.Modularity; - -namespace Acme.BookStore.DbMigrator; - -[DependsOn( - typeof(AbpAutofacModule), - typeof(BookStoreEntityFrameworkCoreModule), - typeof(BookStoreApplicationContractsModule) - )] -public class BookStoreDbMigratorModule : AbpModule -{ - -} +using Acme.BookStore.EntityFrameworkCore; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace Acme.BookStore.DbMigrator; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(BookStoreEntityFrameworkCoreModule), + typeof(BookStoreApplicationContractsModule) +)] +public class BookStoreDbMigratorModule : AbpModule +{ +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/DbMigratorHostedService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/DbMigratorHostedService.cs index 10b7b4c76f..cf77c67c9b 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/DbMigratorHostedService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/DbMigratorHostedService.cs @@ -1,51 +1,51 @@ -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Acme.BookStore.Data; -using Serilog; -using Volo.Abp; -using Volo.Abp.Data; - -namespace Acme.BookStore.DbMigrator; - -public class DbMigratorHostedService : IHostedService -{ - private readonly IHostApplicationLifetime _hostApplicationLifetime; - private readonly IConfiguration _configuration; - - public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, IConfiguration configuration) - { - _hostApplicationLifetime = hostApplicationLifetime; - _configuration = configuration; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - using (var application = await AbpApplicationFactory.CreateAsync(options => - { - options.Services.ReplaceConfiguration(_configuration); - options.UseAutofac(); - options.Services.AddLogging(c => c.AddSerilog()); - options.AddDataMigrationEnvironment(); - })) - { - await application.InitializeAsync(); - - await application - .ServiceProvider - .GetRequiredService() - .MigrateAsync(); - - await application.ShutdownAsync(); - - _hostApplicationLifetime.StopApplication(); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } -} +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Acme.BookStore.Data; +using Serilog; +using Volo.Abp; +using Volo.Abp.Data; + +namespace Acme.BookStore.DbMigrator; + +public class DbMigratorHostedService : IHostedService +{ + private readonly IHostApplicationLifetime _hostApplicationLifetime; + private readonly IConfiguration _configuration; + + public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, IConfiguration configuration) + { + _hostApplicationLifetime = hostApplicationLifetime; + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); + options.AddDataMigrationEnvironment(); + })) + { + await application.InitializeAsync(); + + await application + .ServiceProvider + .GetRequiredService() + .MigrateAsync(); + + await application.ShutdownAsync(); + + _hostApplicationLifetime.StopApplication(); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile new file mode 100644 index 0000000000..e9f208a551 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile @@ -0,0 +1,5 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 +COPY bin/Release/net9.0/publish/ app/ +WORKDIR /app +ENV ASPNETCORE_URLS=http://+:80 +ENTRYPOINT ["dotnet", "Acme.BookStore.DbMigrator.dll"] \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile.local b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile.local new file mode 100644 index 0000000000..abe48af96a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Dockerfile.local @@ -0,0 +1,6 @@ + FROM mcr.microsoft.com/dotnet/aspnet:9.0 + USER $APP_UID + + COPY bin/Release/net9.0/publish/ app/ + WORKDIR /app + ENTRYPOINT ["dotnet", "Acme.BookStore.DbMigrator.dll"] \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Program.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Program.cs index d86f9b5564..328c2d0212 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Program.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/Program.cs @@ -1,41 +1,39 @@ -using System.IO; -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Serilog; -using Serilog.Events; - -namespace Acme.BookStore.DbMigrator; - -class Program -{ - static async Task Main(string[] args) - { - Log.Logger = new LoggerConfiguration() - .MinimumLevel.Information() - .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) - .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) -#if DEBUG - .MinimumLevel.Override("Acme.BookStore", LogEventLevel.Debug) -#else - .MinimumLevel.Override("Acme.BookStore", LogEventLevel.Information) -#endif - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) - .WriteTo.Async(c => c.Console()) - .CreateLogger(); - - await CreateHostBuilder(args).RunConsoleAsync(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureLogging((context, logging) => logging.ClearProviders()) - .ConfigureServices((hostContext, services) => - { - services.AddHostedService(); - }); -} +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; + +namespace Acme.BookStore.DbMigrator; + +class Program +{ + static async Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) +#if DEBUG + .MinimumLevel.Override("Acme.BookStore", LogEventLevel.Debug) +#else + .MinimumLevel.Override("Acme.BookStore", LogEventLevel.Information) +#endif + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + .ConfigureLogging((context, logging) => logging.ClearProviders()) + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.json index e9075611a5..b36c8bd0c7 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.json @@ -1,27 +1,19 @@ -{ - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=BookStore;Trusted_Connection=True;TrustServerCertificate=True" - }, - "OpenIddict": { - "Applications": { - "BookStore_Web": { - "ClientId": "BookStore_Web", - "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44350" - }, - "BookStore_App": { - "ClientId": "BookStore_App", - "RootUrl": "http://localhost:4200" - }, - "BookStore_BlazorServerTiered": { - "ClientId": "BookStore_BlazorServerTiered", - "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44395" - }, - "BookStore_Swagger": { - "ClientId": "BookStore_Swagger", - "RootUrl": "https://localhost:44375" - } - } - } -} \ No newline at end of file +{ + "ConnectionStrings": { + "Default": "Host=localhost;Port=5432;Database=BookStore;User ID=root;Password=root;" + }, + "OpenIddict": { + "Applications": { + "BookStore_App": { + "ClientId": "BookStore_App" }, + "BookStore_Blazor": { + "ClientId": "BookStore_Blazor", + "RootUrl": "https://localhost:44352" + }, + "BookStore_Swagger": { + "ClientId": "BookStore_Swagger", + "RootUrl": "https://localhost:44330/" + } + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.secrets.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.secrets.json index 7a73a41bfd..6104b48d76 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.secrets.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.DbMigrator/appsettings.secrets.json @@ -1,2 +1,3 @@ -{ -} \ No newline at end of file +{ + "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgA2ADQAYQA1AGEAZQBmADUALQBhADcAMQA5AC0AYwAxADYAMAAtADYAYQAwAGEALQAzADkAZQBmADEANgAzADYAZgAxAGEAZAA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4ANgA0AGEANQBhAGUAZgA1AC0AYQA3ADEAOQAtAGMAMQA2ADAALQA2AGEAMABhAC0AMwA5AGUAZgAxADYAMwA2AGYAMQBhAGQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBWAG8AbABvAHMAbwBmAHQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBDAHIAZQBhAHQAaQBvAG4AVABpAG0AZQAiAD4AMgAwADIANQAtADEAMAAtADAAMgAgADEAMAA6ADUAMgA6ADAANQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAA8AC8ATABpAGMAZQBuAHMAZQBBAHQAdAByAGkAYgB1AHQAZQBzAD4ACgAgACAAPABTAGkAZwBuAGEAdAB1AHIAZQA+AE0ARQBRAEMASQBFAFAAaABzAFMAdgBoAHQAWABTAHQAcgB6AHEARwA1AEcAMAAzAGkAdwBTAFYARQBzAGoANABPAGYAUwAwAEgAYgBtAC8AOABxAGMATgA4AGcAOQB4AEEAaQBBAFoATgBXAHkARABvADMARgBlADgARgB5AFEAZwA5AFYAWgBsAEcAdAB1ADYAcgAvAEgATQA0AFcAUAA5ADQAQgBKAEgATgB1ADAAZQBHAGIANgBoAFEAPQA9ADwALwBTAGkAZwBuAGEAdAB1AHIAZQA+AAoAPAAvAEwAaQBjAGUAbgBzAGUAPgBNAEYAawB3AEUAdwBZAEgASwBvAFoASQB6AGoAMABDAEEAUQBZAEkASwBvAFoASQB6AGoAMABEAEEAUQBjAEQAUQBnAEEARQA2ACsANgBUAEgAVAByAGkANQBuAHgAaQA0ACsAMAByADMARABQAEYAOABTAG4AdABGAHkAeQBhAFUAMgBXAFEALwAyAG4AUABjADIAZABEAGoAWQBUAFAAcgBSAGMASQBlADAAbwB0AC8AVABEAHcAeABjAEwATgBmADQAUgBmAFcAWgAzAEIAZgBUAGQAVwBvAE8AOQBQAEUAQgAzAHoASwBLAHYAYgAzAHcAPQA9AF8AMQAyADQA" +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg new file mode 100644 index 0000000000..482d69b4ab --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg.analyze.json new file mode 100644 index 0000000000..4fcfd59939 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.abppkg.analyze.json @@ -0,0 +1,118 @@ +{ + "name": "Acme.BookStore.Domain.Shared", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.Domain.Shared", + "namespace": "Volo.Abp.AuditLogging", + "name": "AbpAuditLoggingDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.BackgroundJobs.Domain.Shared", + "namespace": "Volo.Abp.BackgroundJobs", + "name": "AbpBackgroundJobsDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.Domain.Shared", + "namespace": "Volo.Abp.FeatureManagement", + "name": "AbpFeatureManagementDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.Domain.Shared", + "namespace": "Volo.Abp.PermissionManagement", + "name": "AbpPermissionManagementDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.Domain.Shared", + "namespace": "Volo.Abp.SettingManagement", + "name": "AbpSettingManagementDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.Domain.Shared", + "namespace": "Volo.Abp.Identity", + "name": "AbpIdentityProDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Domain.Shared", + "namespace": "Volo.Abp.OpenIddict", + "name": "AbpOpenIddictProDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.Domain.Shared", + "namespace": "Volo.Abp.LanguageManagement", + "name": "LanguageManagementDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Domain.Shared", + "namespace": "Volo.Abp.TextTemplateManagement", + "name": "TextTemplateManagementDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.Domain.Shared", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.GlobalFeatures", + "namespace": "Volo.Abp.GlobalFeatures", + "name": "AbpGlobalFeaturesModule" + }, + { + "declaringAssemblyName": "Volo.Abp.BlobStoring.Database.Domain.Shared", + "namespace": "Volo.Abp.BlobStoring.Database", + "name": "BlobStoringDatabaseDomainSharedModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreDomainSharedModule", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj index cb316b4498..76fc0a4341 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj @@ -1,31 +1,40 @@ - - - - - - netstandard2.0 - Acme.BookStore - true - - - - - - - - - - - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Authors/AuthorConsts.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Authors/AuthorConsts.cs index c3403b9925..a63aaa5850 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Authors/AuthorConsts.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Authors/AuthorConsts.cs @@ -1,6 +1,7 @@ -namespace Acme.BookStore.Authors; - -public static class AuthorConsts -{ - public const int MaxNameLength = 64; -} +namespace Acme.BookStore.Authors; + +public static class AuthorConsts +{ + public const int MaxNameLength = 64; +} + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs index 8fcac9127b..86bc8b70c3 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs @@ -1,6 +1,7 @@ -namespace Acme.BookStore; - -public static class BookStoreDomainErrorCodes -{ - public const string AuthorAlreadyExists = "BookStore:00001"; -} +namespace Acme.BookStore; + +public static class BookStoreDomainErrorCodes +{ + /* You can add your business exception error codes here, as constants */ + public const string AuthorAlreadyExists = "BookStore:00001"; +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs index 94ad5bdbed..ad6e835eb9 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs @@ -1,58 +1,90 @@ -using Acme.BookStore.Localization; -using Volo.Abp.AuditLogging; -using Volo.Abp.BackgroundJobs; -using Volo.Abp.FeatureManagement; -using Volo.Abp.Identity; -using Volo.Abp.Localization; -using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Modularity; -using Volo.Abp.OpenIddict; -using Volo.Abp.PermissionManagement; -using Volo.Abp.SettingManagement; -using Volo.Abp.TenantManagement; -using Volo.Abp.Validation.Localization; -using Volo.Abp.VirtualFileSystem; - -namespace Acme.BookStore; - -[DependsOn( - typeof(AbpAuditLoggingDomainSharedModule), - typeof(AbpBackgroundJobsDomainSharedModule), - typeof(AbpFeatureManagementDomainSharedModule), - typeof(AbpIdentityDomainSharedModule), - typeof(AbpOpenIddictDomainSharedModule), - typeof(AbpPermissionManagementDomainSharedModule), - typeof(AbpSettingManagementDomainSharedModule), - typeof(AbpTenantManagementDomainSharedModule) - )] -public class BookStoreDomainSharedModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - BookStoreGlobalFeatureConfigurator.Configure(); - BookStoreModuleExtensionConfigurator.Configure(); - } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.FileSets.AddEmbedded(); - }); - - Configure(options => - { - options.Resources - .Add("en") - .AddBaseTypes(typeof(AbpValidationResource)) - .AddVirtualJson("/Localization/BookStore"); - - options.DefaultResourceType = typeof(BookStoreResource); - }); - - Configure(options => - { - options.MapCodeNamespace("BookStore", typeof(BookStoreResource)); - }); - } -} +using Acme.BookStore.Localization; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Validation.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.VirtualFileSystem; +using Volo.Abp.OpenIddict; +using Volo.Abp.BlobStoring.Database; +using Volo.Abp.LanguageManagement; +using Volo.Abp.TextTemplateManagement; +using Volo.Saas; +using Volo.Abp.Gdpr; +using Volo.Abp.GlobalFeatures; + +namespace Acme.BookStore; + +[DependsOn( + typeof(AbpAuditLoggingDomainSharedModule), + typeof(AbpBackgroundJobsDomainSharedModule), + typeof(AbpFeatureManagementDomainSharedModule), + typeof(AbpPermissionManagementDomainSharedModule), + typeof(AbpSettingManagementDomainSharedModule), + typeof(AbpIdentityProDomainSharedModule), + typeof(AbpOpenIddictProDomainSharedModule), + typeof(LanguageManagementDomainSharedModule), + typeof(SaasDomainSharedModule), + typeof(TextTemplateManagementDomainSharedModule), + typeof(AbpGdprDomainSharedModule), + typeof(AbpGlobalFeaturesModule), + typeof(BlobStoringDatabaseDomainSharedModule) + )] +public class BookStoreDomainSharedModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + BookStoreGlobalFeatureConfigurator.Configure(); + BookStoreModuleExtensionConfigurator.Configure(); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddBaseTypes(typeof(AbpValidationResource)) + .AddVirtualJson("/Localization/BookStore"); + + options.DefaultResourceType = typeof(BookStoreResource); + + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("ar", "ar", "Arabic")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "Chinese (Simplified)")); + options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "Chinese (Traditional)")); + options.Languages.Add(new LanguageInfo("cs", "cs", "Czech")); + options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (United Kingdom)")); + options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); + options.Languages.Add(new LanguageInfo("fr", "fr", "French")); + options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "German (Germany)")); + options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi ")); + options.Languages.Add(new LanguageInfo("hu", "hu", "Hungarian")); + options.Languages.Add(new LanguageInfo("is", "is", "Icelandic")); + options.Languages.Add(new LanguageInfo("it", "it", "Italian")); + options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Portuguese (Brazil)")); + options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Romanian (Romania)")); + options.Languages.Add(new LanguageInfo("ru", "ru", "Russian")); + options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak")); + options.Languages.Add(new LanguageInfo("es", "es", "Spanish")); + options.Languages.Add(new LanguageInfo("sv", "sv", "Swedish")); + options.Languages.Add(new LanguageInfo("tr", "tr", "Turkish")); + + }); + + Configure(options => + { + options.MapCodeNamespace("BookStore", typeof(BookStoreResource)); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreGlobalFeatureConfigurator.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreGlobalFeatureConfigurator.cs index c4960c72ad..785afa806c 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreGlobalFeatureConfigurator.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreGlobalFeatureConfigurator.cs @@ -1,22 +1,20 @@ -using Volo.Abp.Threading; - -namespace Acme.BookStore; - -public static class BookStoreGlobalFeatureConfigurator -{ - private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); - - public static void Configure() - { - OneTimeRunner.Run(() => - { - /* You can configure (enable/disable) global features of the used modules here. - * - * YOU CAN SAFELY DELETE THIS CLASS AND REMOVE ITS USAGES IF YOU DON'T NEED TO IT! - * - * Please refer to the documentation to lear more about the Global Features System: - * https://abp.io/docs/latest/Global-Features - */ - }); - } -} +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Threading; + +namespace Acme.BookStore; + +public static class BookStoreGlobalFeatureConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can configure (enable/disable) global features of the used modules here. + * Please refer to the documentation to learn more about the Global Features System: + * https://docs.abp.io/en/abp/latest/Global-Features + */ + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreModuleExtensionConfigurator.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreModuleExtensionConfigurator.cs index b94cf9aa5e..011079fd93 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreModuleExtensionConfigurator.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/BookStoreModuleExtensionConfigurator.cs @@ -1,70 +1,71 @@ -using Volo.Abp.Threading; - -namespace Acme.BookStore; - -public static class BookStoreModuleExtensionConfigurator -{ - private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); - - public static void Configure() - { - OneTimeRunner.Run(() => - { - ConfigureExistingProperties(); - ConfigureExtraProperties(); - }); - } - - private static void ConfigureExistingProperties() - { - /* You can change max lengths for properties of the - * entities defined in the modules used by your application. - * - * Example: Change user and role name max lengths - - IdentityUserConsts.MaxNameLength = 99; - IdentityRoleConsts.MaxNameLength = 99; - - * Notice: It is not suggested to change property lengths - * unless you really need it. Go with the standard values wherever possible. - * - * If you are using EF Core, you will need to run the add-migration command after your changes. - */ - } - - private static void ConfigureExtraProperties() - { - /* You can configure extra properties for the - * entities defined in the modules used by your application. - * - * This class can be used to define these extra properties - * with a high level, easy to use API. - * - * Example: Add a new property to the user entity of the identity module - - ObjectExtensionManager.Instance.Modules() - .ConfigureIdentity(identity => - { - identity.ConfigureUser(user => - { - user.AddOrUpdateProperty( //property type: string - "SocialSecurityNumber", //property name - property => - { - //validation rules - property.Attributes.Add(new RequiredAttribute()); - property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4}); - - property.Configuration[IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit] = true; - - //...other configurations for this property - } - ); - }); - }); - - * See the documentation for more: - * https://abp.io/docs/latest/Module-Entity-Extensions - */ - } -} +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace Acme.BookStore; + +public static class BookStoreModuleExtensionConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + ConfigureExistingProperties(); + ConfigureExtraProperties(); + }); + } + + private static void ConfigureExistingProperties() + { + /* You can change max lengths for properties of the + * entities defined in the modules used by your application. + * + * Example: Change user and role name max lengths + + AbpUserConsts.MaxNameLength = 99; + IdentityRoleConsts.MaxNameLength = 99; + + * Notice: It is not suggested to change property lengths + * unless you really need it. Go with the standard values wherever possible. + * + * If you are using EF Core, you will need to run the add-migration command after your changes. + */ + } + + private static void ConfigureExtraProperties() + { + /* You can configure extra properties for the + * entities defined in the modules used by your application. + * + * This class can be used to define these extra properties + * with a high level, easy to use API. + * + * Example: Add a new property to the user entity of the identity module + + ObjectExtensionManager.Instance.Modules() + .ConfigureIdentity(identity => + { + identity.ConfigureUser(user => + { + user.AddOrUpdateProperty( //property type: string + "SocialSecurityNumber", //property name + property => + { + //validation rules + property.Attributes.Add(new RequiredAttribute()); + property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4}); + + //...other configurations for this property + } + ); + }); + }); + + * See the documentation for more: + * https://abp.io/docs/latest/framework/architecture/modularity/extending/module-entity-extensions + */ + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Books/BookType.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Books/BookType.cs index 4359e44ec7..7896674589 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Books/BookType.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Books/BookType.cs @@ -1,14 +1,14 @@ -namespace Acme.BookStore.Books; - -public enum BookType -{ - Undefined, - Adventure, - Biography, - Dystopia, - Fantastic, - Horror, - Science, - ScienceFiction, - Poetry -} +namespace Acme.BookStore.Books; + +public enum BookType +{ + Undefined, + Adventure, + Biography, + Dystopia, + Fantastic, + Horror, + Science, + ScienceFiction, + Poetry +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ar.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ar.json index 05cb96a9d6..8a909c1189 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ar.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ar.json @@ -1,8 +1,42 @@ -{ - "culture": "ar", - "texts": { - "Menu:Home": "الرئيسية", - "Welcome": "مرحبا", - "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء تشغيل يعتمد على إطار عمل ABP. لمزيد من المعلومات ، يرجى زيارة abp.io." - } -} \ No newline at end of file +{ + "culture": "ar", + "texts": { + "AppName": "BookStore", + "Menu:Home": "منزل، بيت", + "Menu:ContactUs": "اتصل بنا", + "Menu:ArticleSample": "عينة المادة", + "Home": "منزل، بيت", + "Welcome": "مرحبا", + "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء التشغيل يعتمد على إطار عمل برنامج ABP. لمزيد من المعلومات قم بزيارة", + "Date": "تاريخ", + "Permission:Dashboard": "لوحة القيادة", + "Menu:Dashboard": "لوحة القيادة", + "Menu:HomePage": "الصفحة الرئيسية", + "Dashboard": "لوحة القيادة", + "ExternalProvider:Google": "جوجل", + "ExternalProvider:Google:ClientId": "معرف العميل", + "ExternalProvider:Google:ClientSecret": "سر العميل", + "ExternalProvider:Microsoft": "مايكروسوفت", + "ExternalProvider:Microsoft:ClientId": "معرف العميل", + "ExternalProvider:Microsoft:ClientSecret": "سر العميل", + "ExternalProvider:Twitter": "تويتر", + "ExternalProvider:Twitter:ConsumerKey": "مفتاح المستهلك", + "ExternalProvider:Twitter:ConsumerSecret": "سر المستهلك", + "NewsletterHeader": "اشترك في النشرة الإخبارية!", + "NewsletterInfo": "احصل على معلومات حول آخر الأحداث.", + "NewsletterPreference_Default": "النشرة الإخبارية الافتراضية", + "NewsletterPrivacyAcceptMessage": "أوافق على سياسة الخصوصية .", + "Language": "لغة", + "Search": "يبحث", + "LoadMore": "تحميل المزيد", + "Settings": "إعدادات", + "Theme": "سمة", + "DeviceTheme": "موضوع الجهاز", + "Dark": "مظلم", + "Light": "ضوء", + "Unspecified": "نظام", + "SeeAllUsers": "رؤية كافة المستخدمين", + "TakePhoto": "تصوير", + "ChoosePhoto": "اختر صورة" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json index 5a0bbf613e..c5b418a8a0 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json @@ -1,8 +1,40 @@ -{ - "culture": "cs", - "texts": { - "Menu:Home": "Úvod", - "Welcome": "Vítejte", - "LongWelcomeMessage": "Vítejte v aplikaci. Toto je startovací projekt založený na ABP frameworku. Pro více informací, navštivte abp.io." - } -} +{ + "Culture": "cs", + "Texts": { + "AppName": "BookStore", + "Home": "Home", + "Date": "Date", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Home page", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Subscribe to the newsletter!", + "NewsletterInfo": "Get information about the latest happenings.", + "NewsletterPreference_Default": "Default Newsletter", + "NewsletterPrivacyAcceptMessage": "I accept the Privacy Policy.", + "Language": "Language", + "Search": "Search", + "LoadMore": "Load More", + "Settings": "Settings", + "Theme": "Theme", + "DeviceTheme": "Device theme", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "See All Users", + "TakePhoto": "Take Photo", + "ChoosePhoto": "Choose Photo", + "Menu:Home": "Home", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit", + "Welcome": "Welcome" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de-DE.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de-DE.json index aca4528c7c..dadca83644 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de-DE.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de-DE.json @@ -1,8 +1,42 @@ -{ - "culture": "de-DE", - "texts": { - "Menu:Home": "Home", - "Welcome": "Willkommen", - "LongWelcomeMessage": "Willkommen bei der Anwendung. Dies ist ein Startup-Projekt, das auf dem ABP-Framework basiert. Weitere Informationen finden Sie unter abp.io." - } -} \ No newline at end of file +{ + "culture": "de-DE", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Home", + "Menu:ContactUs": "Kontaktiere uns", + "Menu:ArticleSample": "Artikelmuster", + "Home": "Home", + "Welcome": "Willkommen", + "LongWelcomeMessage": "Willkommen in der Anwendung. Dies ist ein Startup-Projekt basierend auf dem ABP-Framework. Weitere Informationen finden Sie unter", + "Date": "Datum", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Startseite", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Kunden ID", + "ExternalProvider:Google:ClientSecret": "Client-Geheimnis", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Kunden ID", + "ExternalProvider:Microsoft:ClientSecret": "Client-Geheimnis", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Verbraucherschlüssel", + "ExternalProvider:Twitter:ConsumerSecret": "Verbrauchergeheimnis", + "NewsletterHeader": "Abonnieren Sie den Newsletter!", + "NewsletterInfo": "Informieren Sie sich über aktuelle Ereignisse.", + "NewsletterPreference_Default": "Standard-Newsletter", + "NewsletterPrivacyAcceptMessage": "Ich akzeptiere die Datenschutzerklärung.", + "Language": "Sprache", + "Search": "Suchen", + "LoadMore": "Mehr laden", + "Settings": "Einstellungen", + "Theme": "Thema", + "DeviceTheme": "Gerätethema", + "Dark": "Dunkel", + "Light": "Licht", + "Unspecified": "System", + "SeeAllUsers": "Alle Benutzer anzeigen", + "TakePhoto": "Foto machen", + "ChoosePhoto": "Wähle ein Foto aus" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de.json deleted file mode 100644 index 831493be86..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/de.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "culture": "de", - "texts": { - "Menu:Home": "Home", - "Welcome": "Willkommen", - "LongWelcomeMessage": "Willkommen bei der Anwendung. Dies ist ein Startup-Projekt, das auf dem ABP-Framework basiert. Weitere Informationen finden Sie unter abp.io." - } -} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en-GB.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en-GB.json index d2ca0793a3..bbca70b0d4 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en-GB.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en-GB.json @@ -1,8 +1,40 @@ -{ - "culture": "en-GB", - "texts": { - "Menu:Home": "Home", - "Welcome": "Welcome", - "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io." - } -} \ No newline at end of file +{ + "Culture": "en-GB", + "Texts": { + "AppName": "BookStore", + "Home": "Home", + "Date": "Date", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Home page", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Subscribe to the newsletter!", + "NewsletterInfo": "Get information about the latest happenings.", + "NewsletterPreference_Default": "Default Newsletter", + "NewsletterPrivacyAcceptMessage": "I accept the Privacy Policy.", + "Language": "Language", + "Search": "Search", + "LoadMore": "Load More", + "Settings": "Settings", + "Theme": "Theme", + "DeviceTheme": "Device theme", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "See All Users", + "TakePhoto": "Take Photo", + "ChoosePhoto": "Choose Photo", + "Menu:Home": "Home", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit", + "Welcome": "Welcome" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json index 45ab76edf8..8103de0b37 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json @@ -1,47 +1,88 @@ -{ - "Culture": "en", - "Texts": { - "Menu:Home": "Home", - "Welcome": "Welcome", - "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", - "Menu:BookStore": "Book Store", - "Menu:Books": "Books", - "Actions": "Actions", - "Close": "Close", - "Delete": "Delete", - "Edit": "Edit", - "PublishDate": "Publish date", - "NewBook": "New book", - "Name": "Name", - "Type": "Type", - "Price": "Price", - "CreationTime": "Creation time", - "AreYouSure": "Are you sure?", - "AreYouSureToDelete": "Are you sure you want to delete this item?", - "Enum:BookType.0": "Undefined", - "Enum:BookType.1": "Adventure", - "Enum:BookType.2": "Biography", - "Enum:BookType.3": "Dystopia", - "Enum:BookType.4": "Fantastic", - "Enum:BookType.5": "Horror", - "Enum:BookType.6": "Science", - "Enum:BookType.7": "Science fiction", - "Enum:BookType.8": "Poetry", - "Permission:BookStore": "Book Store", - "Permission:Books": "Book Management", - "Permission:Books.Create": "Creating new books", - "Permission:Books.Edit": "Editing the books", - "Permission:Books.Delete": "Deleting the books", - "BookStore:00001": "There is already an author with the same name: {name}", - "Permission:Authors": "Author Management", - "Permission:Authors.Create": "Creating new authors", - "Permission:Authors.Edit": "Editing the authors", - "Permission:Authors.Delete": "Deleting the authors", - "Menu:Authors": "Authors", - "Authors": "Authors", - "AuthorDeletionConfirmationMessage": "Are you sure to delete the author '{0}'?", - "BirthDate": "Birth date", - "NewAuthor": "New author", - "AnAuthorIsRequiredForCreatingBook": "An author is required to create a book" - } -} +{ + "Culture": "en", + "Texts": { + "AppName": "BookStore", + "Home": "Home", + "Date": "Date", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Home page", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Subscribe to the newsletter!", + "NewsletterInfo": "Get information about the latest happenings.", + "NewsletterPreference_Default": "Default Newsletter", + "NewsletterPrivacyAcceptMessage": "I accept the Privacy Policy.", + "Language": "Language", + "Search": "Search", + "LoadMore": "Load More", + "Settings": "Settings", + "Theme": "Theme", + "DeviceTheme": "Device theme", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "See All Users", + "TakePhoto": "Take Photo", + "ChoosePhoto": "Choose Photo", + "Menu:Home": "Home", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit", + "Welcome": "Welcome", + "Menu:BookStore": "Book Store", + "Menu:Books": "Books", + "Actions": "Actions", + "Close": "Close", + "Delete": "Delete", + "Edit": "Edit", + "PublishDate": "Publish date", + "NewBook": "New book", + "Name": "Name", + "Type": "Type", + "Price": "Price", + "CreationTime": "Creation time", + "AreYouSure": "Are you sure?", + "AreYouSureToDelete": "Are you sure you want to delete this item?", + "Enum:BookType.0": "Undefined", + "Enum:BookType.1": "Adventure", + "Enum:BookType.2": "Biography", + "Enum:BookType.3": "Dystopia", + "Enum:BookType.4": "Fantastic", + "Enum:BookType.5": "Horror", + "Enum:BookType.6": "Science", + "Enum:BookType.7": "Science fiction", + "Enum:BookType.8": "Poetry", + "Enum:BookType.Undefined": "Undefined", + "Enum:BookType.Adventure": "Adventure", + "Enum:BookType.Biography": "Biography", + "Enum:BookType.Dystopia": "Dystopia", + "Enum:BookType.Fantastic": "Fantastic", + "Enum:BookType.Horror": "Horror", + "Enum:BookType.Science": "Science", + "Enum:BookType.ScienceFiction": "Science fiction", + "Enum:BookType.Poetry": "Poetry", + "Permission:BookStore": "Book Store", + "Permission:Books": "Book Management", + "Permission:Books.Create": "Creating new books", + "Permission:Books.Edit": "Editing the books", + "Permission:Books.Delete": "Deleting the books", + "BookStore:00001": "There is already an author with the same name: {name}", + "Permission:Authors": "Author Management", + "Permission:Authors.Create": "Creating new authors", + "Permission:Authors.Edit": "Editing the authors", + "Permission:Authors.Delete": "Deleting the authors", + "Menu:Authors": "Authors", + "Authors": "Authors", + "AuthorDeletionConfirmationMessage": "Are you sure to delete the author '{0}'?", + "BirthDate": "Birth date", + "NewAuthor": "New author", + "AnAuthorIsRequiredForCreatingBook": "An author is required to create a book" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/es.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/es.json index 31b4b59e25..af19fbc17a 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/es.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/es.json @@ -1,8 +1,42 @@ -{ - "culture": "es", - "texts": { - "Menu:Home": "Inicio", - "Welcome": "Bienvenido", - "LongWelcomeMessage": "Bienvenido a la aplicación, este es un proyecto base basado en el framework ABP. Para más información, visita abp.io." - } -} \ No newline at end of file +{ + "culture": "es", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Hogar", + "Menu:ContactUs": "Contáctenos", + "Menu:ArticleSample": "Muestra de artículo", + "Home": "Hogar", + "Welcome": "Bienvenido", + "LongWelcomeMessage": "Bienvenido a la aplicacion. Este es un proyecto de inicio basado en el marco ABP. Para obtener mas informacion, visite", + "Date": "Fecha", + "Permission:Dashboard": "Panel de control", + "Menu:Dashboard": "Panel de control", + "Menu:HomePage": "Página de inicio", + "Dashboard": "Panel de control", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "ID de cliente", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "ID de cliente", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Clave de consumidor", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Suscríbete a la newsletter!", + "NewsletterInfo": "Obtenga información sobre los últimos acontecimientos.", + "NewsletterPreference_Default": "Boletín de noticias predeterminado", + "NewsletterPrivacyAcceptMessage": "Acepto la Política de privacidad .", + "Language": "Idioma", + "Search": "Buscar", + "LoadMore": "Carga más", + "Settings": "Ajustes", + "Theme": "Tema", + "DeviceTheme": "Tema del dispositivo", + "Dark": "Oscuro", + "Light": "Luz", + "Unspecified": "Sistema", + "SeeAllUsers": "Ver todos los usuarios", + "TakePhoto": "Tomar foto", + "ChoosePhoto": "Escoge una foto" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fi.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fi.json index a318859f23..0f2ca2fbcf 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fi.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fi.json @@ -1,8 +1,42 @@ -{ - "culture": "fi", - "texts": { - "Menu:Home": "Koti", - "Welcome": "Tervetuloa", - "LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa abp.io." - } -} \ No newline at end of file +{ + "culture": "fi", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Koti", + "Menu:ContactUs": "Ota meihin yhteyttä", + "Menu:ArticleSample": "Artikkelinäyte", + "Home": "Koti", + "Welcome": "Tervetuloa", + "LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa", + "Date": "Päivämäärä", + "Permission:Dashboard": "Kojelauta", + "Menu:Dashboard": "Kojelauta", + "Menu:HomePage": "Kotisivu", + "Dashboard": "Kojelauta", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Asiakastunnus", + "ExternalProvider:Google:ClientSecret": "Asiakkaan salaisuus", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Asiakastunnus", + "ExternalProvider:Microsoft:ClientSecret": "Asiakkaan salaisuus", + "ExternalProvider:Twitter": "Viserrys", + "ExternalProvider:Twitter:ConsumerKey": "Kuluttaja-avain", + "ExternalProvider:Twitter:ConsumerSecret": "Kuluttajan salaisuus", + "NewsletterHeader": "Tilaa uutiskirje!", + "NewsletterInfo": "Hanki tietoa viimeisimmistä tapahtumista.", + "NewsletterPreference_Default": "Oletusuutiskirje", + "NewsletterPrivacyAcceptMessage": "Hyväksyn tietosuojakäytännön .", + "Language": "Kieli", + "Search": "Hae", + "LoadMore": "Lataa lisää", + "Settings": "asetukset", + "Theme": "Teema", + "DeviceTheme": "Laitteen teema", + "Dark": "Tumma", + "Light": "Kevyt", + "Unspecified": "Järjestelmä", + "SeeAllUsers": "Katso Kaikki käyttäjät", + "TakePhoto": "Ota valokuva", + "ChoosePhoto": "Valitse Valokuva" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fr.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fr.json index e76eac0c71..c49c17b943 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fr.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/fr.json @@ -1,8 +1,42 @@ -{ - "culture": "fr", - "texts": { - "Menu:Home": "Accueil", - "Welcome": "Bienvenue", - "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io." - } -} \ No newline at end of file +{ + "culture": "fr", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Acceuil", + "Menu:ContactUs": "Nous contacter", + "Menu:ArticleSample": "Échantillon d'article", + "Home": "Acceuil", + "Welcome": "Bienvenue", + "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez", + "Date": "Date", + "Permission:Dashboard": "Tableau de bord", + "Menu:Dashboard": "Tableau de bord", + "Menu:HomePage": "Page d'accueil", + "Dashboard": "Tableau de bord", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "identité du client", + "ExternalProvider:Google:ClientSecret": "Secret du client", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "identité du client", + "ExternalProvider:Microsoft:ClientSecret": "Secret du client", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "La clé du consommateur", + "ExternalProvider:Twitter:ConsumerSecret": "Secret du consommateur", + "NewsletterHeader": "Abonnez-vous à la newsletter!", + "NewsletterInfo": "Obtenez des informations sur les derniers événements.", + "NewsletterPreference_Default": "Newsletter par défaut", + "NewsletterPrivacyAcceptMessage": "J'accepte la Politique de confidentialité .", + "Language": "Langue", + "Search": "Recherche", + "LoadMore": "Charger plus", + "Settings": "Paramètres", + "Theme": "Thème", + "DeviceTheme": "Thème de l'appareil", + "Dark": "Sombre", + "Light": "Lumière", + "Unspecified": "Système", + "SeeAllUsers": "Voir tous les utilisateurs", + "TakePhoto": "Prendre une photo", + "ChoosePhoto": "Choisissez une photo" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hi.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hi.json index a1676bfd45..1db90814ca 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hi.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hi.json @@ -1,8 +1,42 @@ -{ - "culture": "hi", - "texts": { - "Menu:Home": "घर", - "Welcome": "स्वागत हे", - "LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए, abp.io पर जाएं।" - } -} \ No newline at end of file +{ + "culture": "hi", + "texts": { + "AppName": "BookStore", + "Menu:Home": "घर", + "Menu:ContactUs": "संपर्क करें", + "Menu:ArticleSample": "आलेख नमूना", + "Home": "घर", + "Welcome": "स्वागत हे", + "LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए पर जाएँ।", + "Date": "दिनांक", + "Permission:Dashboard": "डैशबोर्ड", + "Menu:Dashboard": "डैशबोर्ड", + "Menu:HomePage": "मुख पृष्ठ", + "Dashboard": "डैशबोर्ड", + "ExternalProvider:Google": "गूगल", + "ExternalProvider:Google:ClientId": "ग्राहक ID", + "ExternalProvider:Google:ClientSecret": "ग्राहक गुप्त", + "ExternalProvider:Microsoft": "माइक्रोसॉफ्ट", + "ExternalProvider:Microsoft:ClientId": "ग्राहक ID", + "ExternalProvider:Microsoft:ClientSecret": "ग्राहक गुप्त", + "ExternalProvider:Twitter": "ट्विटर", + "ExternalProvider:Twitter:ConsumerKey": "उपभोक्ता कुंजी", + "ExternalProvider:Twitter:ConsumerSecret": "उपभोक्ता रहस्य", + "NewsletterHeader": "न्यूज़लेटर की सदस्यता लें!", + "NewsletterInfo": "नवीनतम घटनाओं के बारे में जानकारी प्राप्त करें।", + "NewsletterPreference_Default": "डिफ़ॉल्ट न्यूज़लैटर", + "NewsletterPrivacyAcceptMessage": "मैं गोपनीयता नीति स्वीकार करता हूं।", + "Language": "भाषा", + "Search": "खोज", + "LoadMore": "और लोड करें", + "Settings": "समायोजन", + "Theme": "विषय", + "DeviceTheme": "डिवाइस थीम", + "Dark": "अँधेरा", + "Light": "रोशनी", + "Unspecified": "प्रणाली", + "SeeAllUsers": "सभी उपयोगकर्ता देखें", + "TakePhoto": "फोटो लो", + "ChoosePhoto": "तस्विर का चयन करो" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hu.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hu.json index c7b6a33a0f..b529fc12b3 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hu.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/hu.json @@ -1,8 +1,42 @@ -{ - "culture": "hu", - "texts": { - "Menu:Home": "Kezdőlap", - "Welcome": "Üdvözlöm", - "LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információkért látogasson el az abp.io oldalra." - } -} \ No newline at end of file +{ + "culture": "hu", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Kezdőlap", + "Menu:ContactUs": "Lépjen kapcsolatba velünk", + "Menu:ArticleSample": "Cikkminta", + "Home": "Kezdőlap", + "Welcome": "Üdvözöljük", + "LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információért látogasson el az oldalra", + "Date": "dátum", + "Permission:Dashboard": "Irányítópult", + "Menu:Dashboard": "Irányítópult", + "Menu:HomePage": "Kezdőlap", + "Dashboard": "Irányítópult", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Ügyfélazonosító", + "ExternalProvider:Google:ClientSecret": "Ügyfél titkos kulcs", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Ügyfélazonosító", + "ExternalProvider:Microsoft:ClientSecret": "Ügyfél titkos kulcs", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Fogyasztói kulcs", + "ExternalProvider:Twitter:ConsumerSecret": "Fogyasztói titkos kulcs", + "NewsletterHeader": "Iratkozz fel a hírlevélre!", + "NewsletterInfo": "Tájékozódjon a legfrissebb eseményekről.", + "NewsletterPreference_Default": "Alapértelmezett hírlevél", + "NewsletterPrivacyAcceptMessage": "Elfogadom az Adatvédelmi szabályzatot .", + "Language": "Nyelv", + "Search": "Keresés", + "LoadMore": "Load More", + "Settings": "Beállítások", + "Theme": "Téma", + "DeviceTheme": "Eszköz téma", + "Dark": "Sötét", + "Light": "Fény", + "Unspecified": "Rendszer", + "SeeAllUsers": "Lásd: Összes felhasználó", + "TakePhoto": "Fotót készíteni", + "ChoosePhoto": "Válassz képet" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/is.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/is.json index 190df90373..cbc0c895d9 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/is.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/is.json @@ -1,8 +1,40 @@ -{ - "culture": "is", - "texts": { - "Menu:Home": "Heim", - "Welcome": "Velkomin", - "LongWelcomeMessage": "Verið velkomin í forritið. Þetta er startup verkefni sem byggir á ABP. Nánari upplýsingar er að finna á abp.io." - } -} \ No newline at end of file +{ + "Culture": "is", + "Texts": { + "AppName": "BookStore", + "Home": "Home", + "Date": "Date", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Home page", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Subscribe to the newsletter!", + "NewsletterInfo": "Get information about the latest happenings.", + "NewsletterPreference_Default": "Default Newsletter", + "NewsletterPrivacyAcceptMessage": "I accept the Privacy Policy.", + "Language": "Language", + "Search": "Search", + "LoadMore": "Load More", + "Settings": "Settings", + "Theme": "Theme", + "DeviceTheme": "Device theme", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "See All Users", + "TakePhoto": "Take Photo", + "ChoosePhoto": "Choose Photo", + "Menu:Home": "Home", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit", + "Welcome": "Welcome" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/it.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/it.json index 82ce42b033..f5c22f8fcd 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/it.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/it.json @@ -1,8 +1,42 @@ -{ - "culture": "it", - "texts": { - "Menu:Home": "Home", - "Welcome": "Benvenuto", - "LongWelcomeMessage": "Benvenuto nell'applicazione. Questo è un progetto di avvio basato sul framework ABP. Per ulteriori informazioni, visita abp.io." - } -} \ No newline at end of file +{ + "culture": "it", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Home", + "Menu:ContactUs": "Contattaci", + "Menu:ArticleSample": "Esempio di articolo", + "Home": "Home", + "Welcome": "Benvenuto", + "LongWelcomeMessage": "Benvenuto nell'applicazione. Questo è un progetto di avvio basato sul framework ABP. Per maggiori informazioni visita", + "Date": "Data", + "Permission:Dashboard": "Cruscotto", + "Menu:Dashboard": "Cruscotto", + "Menu:HomePage": "Pagina iniziale", + "Dashboard": "Cruscotto", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Iscriviti alla newsletter!", + "NewsletterInfo": "Ottieni informazioni sugli ultimi avvenimenti.", + "NewsletterPreference_Default": "Newsletter predefinita", + "NewsletterPrivacyAcceptMessage": "Accetto la Informativa sulla privacy.", + "Language": "Lingua", + "Search": "Ricerca", + "LoadMore": "Carica altro", + "Settings": "Impostazioni", + "Theme": "Tema", + "DeviceTheme": "Tema del dispositivo", + "Dark": "Buio", + "Light": "Leggero", + "Unspecified": "Sistema", + "SeeAllUsers": "Visualizza tutti gli utenti", + "TakePhoto": "Fare foto", + "ChoosePhoto": "Scegli la foto" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/nl.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/nl.json deleted file mode 100644 index 9ba8da4743..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/nl.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "culture": "nl", - "texts": { - "Menu:Home": "Home", - "Welcome": "Welkom", - "LongWelcomeMessage": "Welkom bij de applicatie. Dit is een startup-project gebaseerd op het ABP-framework. Bezoek abp.io voor meer informatie." - } -} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pl-PL.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pl-PL.json deleted file mode 100644 index 33412f307c..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pl-PL.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "culture": "pl-PL", - "texts": { - "Menu:Home": "Home", - "Welcome": "Witaj", - "LongWelcomeMessage": "Witaj w aplikacji. To jest inicjalny projekt bazujący na ABP framework. Po więcej informacji odwiedź stronę abp.io." - } -} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pt-BR.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pt-BR.json index 8c818a07af..e086a59923 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pt-BR.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pt-BR.json @@ -1,8 +1,42 @@ -{ - "culture": "pt-BR", - "texts": { - "Menu:Home": "Principal", - "Welcome": "Seja bem-vindo!", - "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite abp.io." - } -} \ No newline at end of file +{ + "culture": "pt-BR", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Principal", + "Menu:ContactUs": "Entre em contato conosco", + "Menu:ArticleSample": "Amostra de Artigo", + "Home": "Casa", + "Welcome": "Seja bem-vindo!", + "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite", + "Date": "Data", + "Permission:Dashboard": "Painel", + "Menu:Dashboard": "Painel", + "Menu:HomePage": "Pagina inicial", + "Dashboard": "Painel", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "ID do Cliente", + "ExternalProvider:Google:ClientSecret": "Segredo do cliente", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "ID do Cliente", + "ExternalProvider:Microsoft:ClientSecret": "Segredo do cliente", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Chave do consumidor", + "ExternalProvider:Twitter:ConsumerSecret": "consumidor secreto", + "NewsletterHeader": "Assine a newsletter!", + "NewsletterInfo": "Obtenha informações sobre os últimos acontecimentos.", + "NewsletterPreference_Default": "Boletim informativo padrão", + "NewsletterPrivacyAcceptMessage": "Eu aceito a Política de Privacidade .", + "Language": "Linguagem", + "Search": "Procurar", + "LoadMore": "Carregue mais", + "Settings": "Configurações", + "Theme": "Tema", + "DeviceTheme": "Tema do dispositivo", + "Dark": "Escuro", + "Light": "Luz", + "Unspecified": "Sistema", + "SeeAllUsers": "Ver todos os usuários", + "TakePhoto": "Tirar fotos", + "ChoosePhoto": "Escolher Foto" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ro-RO.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ro-RO.json index 1fe560196e..d53bc2f21a 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ro-RO.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ro-RO.json @@ -1,8 +1,40 @@ -{ - "culture": "ro-RO", - "texts": { - "Menu:Home": "Acasă", - "Welcome": "Bun venit", - "LongWelcomeMessage": "Bun venit la aplicaţie. Acesta este un proiect de pornire bazat pe framework-ul ABP. Pentru mai multe informaţii, vizitaţi, visit abp.io." - } -} \ No newline at end of file +{ + "Culture": "ro-RO", + "Texts": { + "AppName": "BookStore", + "Home": "Home", + "Date": "Date", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Home page", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Subscribe to the newsletter!", + "NewsletterInfo": "Get information about the latest happenings.", + "NewsletterPreference_Default": "Default Newsletter", + "NewsletterPrivacyAcceptMessage": "I accept the Privacy Policy.", + "Language": "Language", + "Search": "Search", + "LoadMore": "Load More", + "Settings": "Settings", + "Theme": "Theme", + "DeviceTheme": "Device theme", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "See All Users", + "TakePhoto": "Take Photo", + "ChoosePhoto": "Choose Photo", + "Menu:Home": "Home", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit", + "Welcome": "Welcome" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ru.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ru.json index 8464e44344..bf3991deb2 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ru.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/ru.json @@ -1,8 +1,42 @@ -{ - "culture": "ru", - "texts": { - "Menu:Home": "Главная", - "Welcome": "Добро пожаловать", - "LongWelcomeMessage": "Добро пожаловать в приложение. Этот запущенный проект основан на фреймворке ABP. Для получения дополнительной информации посетите сайт abp.io." - } -} +{ + "culture": "ru", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Дома", + "Menu:ContactUs": "Связаться с нами", + "Menu:ArticleSample": "Образец статьи", + "Home": "Дома", + "Welcome": "Добро пожаловать", + "LongWelcomeMessage": "Добро пожаловать в приложение. Это стартап-проект, основанный на структуре ABP. Для получения дополнительной информации посетите сайт", + "Date": "датировать", + "Permission:Dashboard": "Панель приборов", + "Menu:Dashboard": "Панель приборов", + "Menu:HomePage": "Домашняя страница", + "Dashboard": "Панель приборов", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "ID клиента", + "ExternalProvider:Google:ClientSecret": "Секрет клиента", + "ExternalProvider:Microsoft": "Майкрософт", + "ExternalProvider:Microsoft:ClientId": "ID клиента", + "ExternalProvider:Microsoft:ClientSecret": "Секрет клиента", + "ExternalProvider:Twitter": "Твиттер", + "ExternalProvider:Twitter:ConsumerKey": "Потребительский ключ", + "ExternalProvider:Twitter:ConsumerSecret": "Потребительский секрет", + "NewsletterHeader": "Подпишитесь на рассылку!", + "NewsletterInfo": "Получайте информацию о последних событиях.", + "NewsletterPreference_Default": "Информационный бюллетень по умолчанию", + "NewsletterPrivacyAcceptMessage": "Я принимаю Политику конфиденциальности.", + "Language": "Язык", + "Search": "Поиск", + "LoadMore": "Загрузи больше", + "Settings": "Настройки", + "Theme": "Тема", + "DeviceTheme": "Тема устройства", + "Dark": "Темный", + "Light": "Свет", + "Unspecified": "Система", + "SeeAllUsers": "Просмотреть всех пользователей", + "TakePhoto": "Сделать фотографию", + "ChoosePhoto": "Выбрать фото" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sk.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sk.json index 4f35aaf1c3..24e69b03db 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sk.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sk.json @@ -1,8 +1,42 @@ -{ - "culture": "sk", - "texts": { - "Menu:Home": "Domov", - "Welcome": "Vitajte", - "LongWelcomeMessage": "Vitajte v aplikácii. Toto je štartovací projekt založený na ABP frameworku. Viac informácií nájdete na stránke abp.io." - } -} \ No newline at end of file +{ + "culture": "sk", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Domov", + "Menu:ContactUs": "Kontaktujte nás", + "Menu:ArticleSample": "Ukážka článku", + "Home": "Domov", + "Welcome": "Vitajte", + "LongWelcomeMessage": "Vitajte v aplikácii. Toto je štartovací projekt založený na ABP frameworku. Viac informácií nájdete na stránke", + "Date": "Dátum", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Domovská stránka", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Prihláste sa na odber noviniek!", + "NewsletterInfo": "Získajte informácie o najnovšiom dianí.", + "NewsletterPreference_Default": "Predvolený odber noviniek", + "NewsletterPrivacyAcceptMessage": "Súhlasím so Zásadami ochrany osobných údajov.", + "Language": "Jazyk", + "Search": "Vyhľadávanie", + "LoadMore": "Načítať viac", + "Settings": "nastavenie", + "Theme": "Téma", + "DeviceTheme": "Téma zariadenia", + "Dark": "Tmavý", + "Light": "Svetlo", + "Unspecified": "Systém", + "SeeAllUsers": "Pozrite si Všetci používatelia", + "TakePhoto": "Odfoť", + "ChoosePhoto": "Vyberte fotografiu" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sl.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sl.json deleted file mode 100644 index a066ef26ba..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sl.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "culture": "sl", - "texts": { - "Menu:Home": "Domov", - "Welcome": "Dobrodošli", - "LongWelcomeMessage": "Dobrodošli v aplikaciji. To je začetni projekt na osnovi okolja ABP. Za več informacij obiščite abp.io." - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sv.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sv.json new file mode 100644 index 0000000000..1e948f853a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/sv.json @@ -0,0 +1,42 @@ +{ + "Culture": "sv", + "Texts": { + "AppName": "BookStore", + "Menu:ContactUs": "Kontakta oss", + "Menu:ArticleSample": "Artikelexempel", + "Home": "Hem", + "Date": "Datum", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Hemsida", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Klient-ID", + "ExternalProvider:Google:ClientSecret": "Klienthemlighet", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Klient-ID", + "ExternalProvider:Microsoft:ClientSecret": "Klienthemlighet", + "ExternalProvider:Twitter": "Twitter (X)", + "ExternalProvider:Twitter:ConsumerKey": "Konsumentnyckel", + "ExternalProvider:Twitter:ConsumerSecret": "Konsumenthemlighet", + "NewsletterHeader": "Prenumerera på nyhetsbrevet!", + "NewsletterInfo": "Få information om de senaste händelserna.", + "NewsletterPreference_Default": "Standardnyhetsbrev", + "NewsletterPrivacyAcceptMessage": "Jag accepterar Sekretesspolicy.", + "Language": "Språk", + "Search": "Söka", + "LoadMore": "Ladda mer", + "Settings": "Inställningar", + "Theme": "Tema", + "DeviceTheme": "Enhetstema", + "Dark": "Mörk", + "Light": "Ljus", + "Unspecified": "System", + "SeeAllUsers": "Se Alla användare", + "TakePhoto": "Ta foto", + "ChoosePhoto": "Välj Foto", + "Menu:Home": "Hem", + "LongWelcomeMessage": "Välkommen till ansökan. ", + "Welcome": "Välkomna" + } + } \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json index 4694247d4c..6f60914cb4 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json @@ -1,17 +1,42 @@ -{ - "culture": "tr", - "texts": { - "Menu:Home": "Ana sayfa", - "Welcome": "Hoşgeldiniz", - "LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için abp.io adresini ziyaret edebilirsiniz.", - "Enum:BookType.0": "Belirsiz", - "Enum:BookType.1": "Macera", - "Enum:BookType.2": "Biografi", - "Enum:BookType.3": "Distopya", - "Enum:BookType.4": "Fantastik", - "Enum:BookType.5": "Korku", - "Enum:BookType.6": "Bilim", - "Enum:BookType.7": "Bilim Kurgu", - "Enum:BookType.8": "Masal" - } -} \ No newline at end of file +{ + "culture": "tr", + "texts": { + "AppName": "BookStore", + "Menu:Home": "Ana sayfa", + "Menu:ContactUs": "Bize Ulaşın", + "Menu:ArticleSample": "Yazı Örneği", + "Home": "Ana sayfa", + "Welcome": "Hoşgeldiniz", + "LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için ziyaret edebilirsiniz", + "Date": "Tarih", + "Permission:Dashboard": "Genel görünüm", + "Menu:Dashboard": "Genel görünüm", + "Menu:HomePage": "ana sayfa", + "Dashboard": "Genel görünüm", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Bültene abone olun!", + "NewsletterInfo": "Son gelişmeler hakkında bilgi alın.", + "NewsletterPreference_Default": "Varsayılan Bülten", + "NewsletterPrivacyAcceptMessage": "Gizlilik Politikası'nı kabul ediyorum.", + "Language": "Dil", + "Search": "Ara", + "LoadMore": "Daha fazla yükle", + "Settings": "Ayarlar", + "Theme": "Tema", + "DeviceTheme": "Cihaz Teması", + "Dark": "Koyu", + "Light": "Açık", + "Unspecified": "Sistem", + "SeeAllUsers": "Tüm Kullanıcıları Gör", + "TakePhoto": "Fotoğraf Çek", + "ChoosePhoto": "Fotoğraf Seç" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/vi.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/vi.json deleted file mode 100644 index c115a35726..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/vi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "culture": "vi", - "texts": { - "Menu:Home": "Trang chủ", - "Welcome": "Chào mừng bạn", - "LongWelcomeMessage": "Chào mừng bạn đến ứng dụng. Đây là một dự án khởi nghiệp dựa trên khung ABP. Để biết thêm thông tin, hãy truy cập abp.io." - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json index 23790bde50..dcbda4347a 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json @@ -1,8 +1,42 @@ -{ - "culture": "zh-Hans", - "texts": { - "Menu:Home": "首页", - "Welcome": "欢迎", - "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 abp.io." - } - } \ No newline at end of file +{ + "culture": "zh-Hans", + "texts": { + "AppName": "BookStore", + "Menu:Home": "首页", + "Menu:ContactUs": "联系我们", + "Menu:ArticleSample": "文章示例", + "Home": "首页", + "Welcome": "欢迎", + "LongWelcomeMessage": "欢迎使用本应用程序。这是一个基于 ABP 框架的启动项目。欲了解更多信息,请访问", + "Date": "日期", + "Permission:Dashboard": "仪表板", + "Menu:Dashboard": "仪表板", + "Menu:HomePage": "主页", + "Dashboard": "仪表板", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client Id", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client Id", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "订阅时事通讯!", + "NewsletterInfo": "了解最新动态。", + "NewsletterPreference_Default": "默认通讯", + "NewsletterPrivacyAcceptMessage": "我接受隐私政策。", + "Language": "语言", + "Search": "搜索", + "LoadMore": "加载更多", + "Settings": "设置", + "Theme": "主题", + "DeviceTheme": "设备主题", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "查看所有用户", + "TakePhoto": "拍摄照片", + "ChoosePhoto": "选择照片" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hant.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hant.json index 31e0ab5a47..7baa8e6ca6 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hant.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hant.json @@ -1,8 +1,40 @@ -{ - "culture": "zh-Hant", - "texts": { - "Menu:Home": "首頁", - "Welcome": "歡迎", - "LongWelcomeMessage": "歡迎來到此應用程式. 這是一個基於ABP框架的起始專案. 有關更多訊息, 請瀏覽 abp.io." - } - } \ No newline at end of file +{ + "Culture": "zh-Hant", + "Texts": { + "AppName": "BookStore", + "Home": "Home", + "Date": "Date", + "Permission:Dashboard": "Dashboard", + "Menu:Dashboard": "Dashboard", + "Menu:HomePage": "Home page", + "Dashboard": "Dashboard", + "ExternalProvider:Google": "Google", + "ExternalProvider:Google:ClientId": "Client ID", + "ExternalProvider:Google:ClientSecret": "Client Secret", + "ExternalProvider:Microsoft": "Microsoft", + "ExternalProvider:Microsoft:ClientId": "Client ID", + "ExternalProvider:Microsoft:ClientSecret": "Client Secret", + "ExternalProvider:Twitter": "Twitter", + "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", + "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", + "NewsletterHeader": "Subscribe to the newsletter!", + "NewsletterInfo": "Get information about the latest happenings.", + "NewsletterPreference_Default": "Default Newsletter", + "NewsletterPrivacyAcceptMessage": "I accept the Privacy Policy.", + "Language": "Language", + "Search": "Search", + "LoadMore": "Load More", + "Settings": "Settings", + "Theme": "Theme", + "DeviceTheme": "Device theme", + "Dark": "Dark", + "Light": "Light", + "Unspecified": "System", + "SeeAllUsers": "See All Users", + "TakePhoto": "Take Photo", + "ChoosePhoto": "Choose Photo", + "Menu:Home": "Home", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit", + "Welcome": "Welcome" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs index 17c4334db9..2ac57adcff 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs @@ -1,9 +1,9 @@ -using Volo.Abp.Localization; - -namespace Acme.BookStore.Localization; - -[LocalizationResourceName("BookStore")] -public class BookStoreResource -{ - -} +using Volo.Abp.Localization; + +namespace Acme.BookStore.Localization; + +[LocalizationResourceName("BookStore")] +public class BookStoreResource +{ + +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs index 3493f97606..5102f8c2b4 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs @@ -1,10 +1,10 @@ -namespace Acme.BookStore.MultiTenancy; - -public static class MultiTenancyConsts -{ - /* Enable/disable multi-tenancy easily in a single point. - * If you will never need to multi-tenancy, you can remove - * related modules and code parts, including this file. - */ - public const bool IsEnabled = true; -} +namespace Acme.BookStore.MultiTenancy; + +public static class MultiTenancyConsts +{ + /* Enable/disable multi-tenancy easily in a single point. + * If you will never need to multi-tenancy, you can remove + * related modules and code parts, including this file. + */ + public const bool IsEnabled = true; +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg new file mode 100644 index 0000000000..924a150bc7 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg.analyze.json new file mode 100644 index 0000000000..544713e468 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.abppkg.analyze.json @@ -0,0 +1,138 @@ +{ + "name": "Acme.BookStore.Domain", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Acme.BookStore.Domain.Shared", + "namespace": "Acme.BookStore", + "name": "BookStoreDomainSharedModule" + }, + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.Domain", + "namespace": "Volo.Abp.AuditLogging", + "name": "AbpAuditLoggingDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Caching", + "namespace": "Volo.Abp.Caching", + "name": "AbpCachingModule" + }, + { + "declaringAssemblyName": "Volo.Abp.BackgroundJobs.Domain", + "namespace": "Volo.Abp.BackgroundJobs", + "name": "AbpBackgroundJobsDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.Domain", + "namespace": "Volo.Abp.FeatureManagement", + "name": "AbpFeatureManagementDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.Domain.Identity", + "namespace": "Volo.Abp.PermissionManagement.Identity", + "name": "AbpPermissionManagementDomainIdentityModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.Domain.OpenIddict", + "namespace": "Volo.Abp.PermissionManagement.OpenIddict", + "name": "AbpPermissionManagementDomainOpenIddictModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.Domain", + "namespace": "Volo.Abp.SettingManagement", + "name": "AbpSettingManagementDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Emailing", + "namespace": "Volo.Abp.Emailing", + "name": "AbpEmailingModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.Domain", + "namespace": "Volo.Abp.Identity", + "name": "AbpIdentityProDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Domain", + "namespace": "Volo.Abp.OpenIddict", + "name": "AbpOpenIddictProDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Domain", + "namespace": "Volo.Abp.TextTemplateManagement", + "name": "TextTemplateManagementDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.Domain", + "namespace": "Volo.Abp.LanguageManagement", + "name": "LanguageManagementDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Commercial.SuiteTemplates", + "namespace": "Volo.Abp.Commercial.SuiteTemplates", + "name": "VoloAbpCommercialSuiteTemplatesModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.Domain", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.BlobStoring.Database.Domain", + "namespace": "Volo.Abp.BlobStoring.Database", + "name": "BlobStoringDatabaseDomainModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreDomainModule", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj index 219668459d..8f34e51edc 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj @@ -1,27 +1,37 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/Author.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/Author.cs index 1928456814..6f37361da2 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/Author.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/Author.cs @@ -1,45 +1,44 @@ -using JetBrains.Annotations; -using System; -using Volo.Abp; -using Volo.Abp.Domain.Entities.Auditing; - -namespace Acme.BookStore.Authors; - -public class Author : FullAuditedAggregateRoot -{ - public string Name { get; private set; } - public DateTime BirthDate { get; set; } - public string ShortBio { get; set; } - - private Author() - { - /* This constructor is for deserialization / ORM purpose */ - } - - internal Author( - Guid id, - [NotNull] string name, - DateTime birthDate, - [CanBeNull] string shortBio = null) - : base(id) - { - SetName(name); - BirthDate = birthDate; - ShortBio = shortBio; - } - - internal Author ChangeName([NotNull] string name) - { - SetName(name); - return this; - } - - private void SetName([NotNull] string name) - { - Name = Check.NotNullOrWhiteSpace( - name, - nameof(name), - maxLength: AuthorConsts.MaxNameLength - ); - } -} +using System; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Acme.BookStore.Authors; + +public class Author : FullAuditedAggregateRoot +{ + public string Name { get; private set; } + public DateTime BirthDate { get; set; } + public string ShortBio { get; set; } + + private Author() + { + /* This constructor is for deserialization / ORM purpose */ + } + + internal Author( + Guid id, + string name, + DateTime birthDate, + string? shortBio = null) + : base(id) + { + SetName(name); + BirthDate = birthDate; + ShortBio = shortBio; + } + + internal Author ChangeName(string name) + { + SetName(name); + return this; + } + + private void SetName(string name) + { + Name = Check.NotNullOrWhiteSpace( + name, + nameof(name), + maxLength: AuthorConsts.MaxNameLength + ); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorAlreadyExistsException.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorAlreadyExistsException.cs index 3a913bbc7c..097206c467 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorAlreadyExistsException.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorAlreadyExistsException.cs @@ -1,14 +1,12 @@ -using System; -using Volo.Abp; - -namespace Acme.BookStore.Authors; - -[Serializable] -public class AuthorAlreadyExistsException : BusinessException -{ - public AuthorAlreadyExistsException(string name) - : base(BookStoreDomainErrorCodes.AuthorAlreadyExists) - { - WithData("name", name); - } -} +using Volo.Abp; + +namespace Acme.BookStore.Authors; + +public class AuthorAlreadyExistsException : BusinessException +{ + public AuthorAlreadyExistsException(string name) + : base(BookStoreDomainErrorCodes.AuthorAlreadyExists) + { + WithData("name", name); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorManager.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorManager.cs index 8a1e21fb44..73ee79ad80 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorManager.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/AuthorManager.cs @@ -1,54 +1,53 @@ -using JetBrains.Annotations; -using System; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Domain.Services; - -namespace Acme.BookStore.Authors; - -public class AuthorManager : DomainService -{ - private readonly IAuthorRepository _authorRepository; - - public AuthorManager(IAuthorRepository authorRepository) - { - _authorRepository = authorRepository; - } - - public async Task CreateAsync( - [NotNull] string name, - DateTime birthDate, - [CanBeNull] string shortBio = null) - { - Check.NotNullOrWhiteSpace(name, nameof(name)); - - var existingAuthor = await _authorRepository.FindByNameAsync(name); - if (existingAuthor != null) - { - throw new AuthorAlreadyExistsException(name); - } - - return new Author( - GuidGenerator.Create(), - name, - birthDate, - shortBio - ); - } - - public async Task ChangeNameAsync( - [NotNull] Author author, - [NotNull] string newName) - { - Check.NotNull(author, nameof(author)); - Check.NotNullOrWhiteSpace(newName, nameof(newName)); - - var existingAuthor = await _authorRepository.FindByNameAsync(newName); - if (existingAuthor != null && existingAuthor.Id != author.Id) - { - throw new AuthorAlreadyExistsException(newName); - } - - author.ChangeName(newName); - } -} +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Services; + +namespace Acme.BookStore.Authors; + +public class AuthorManager : DomainService +{ + private readonly IAuthorRepository _authorRepository; + + public AuthorManager(IAuthorRepository authorRepository) + { + _authorRepository = authorRepository; + } + + public async Task CreateAsync( + string name, + DateTime birthDate, + string? shortBio = null) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + var existingAuthor = await _authorRepository.FindByNameAsync(name); + if (existingAuthor != null) + { + throw new AuthorAlreadyExistsException(name); + } + + return new Author( + GuidGenerator.Create(), + name, + birthDate, + shortBio + ); + } + + public async Task ChangeNameAsync( + Author author, + string newName) + { + Check.NotNull(author, nameof(author)); + Check.NotNullOrWhiteSpace(newName, nameof(newName)); + + var existingAuthor = await _authorRepository.FindByNameAsync(newName); + if (existingAuthor != null && existingAuthor.Id != author.Id) + { + throw new AuthorAlreadyExistsException(newName); + } + + author.ChangeName(newName); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/IAuthorRepository.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/IAuthorRepository.cs index 65a7da13e0..232a57acb3 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/IAuthorRepository.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Authors/IAuthorRepository.cs @@ -1,18 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore.Authors; - -public interface IAuthorRepository : IRepository -{ - Task FindByNameAsync(string name); - - Task> GetListAsync( - int skipCount, - int maxResultCount, - string sorting, - string filter = null - ); -} +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Acme.BookStore.Authors; + +public interface IAuthorRepository : IRepository +{ + Task FindByNameAsync(string name); + + Task> GetListAsync( + int skipCount, + int maxResultCount, + string sorting, + string filter = null + ); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreConsts.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreConsts.cs index 5f4604f9e5..09163b9239 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreConsts.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreConsts.cs @@ -1,8 +1,11 @@ -namespace Acme.BookStore; - -public static class BookStoreConsts -{ - public const string DbTablePrefix = "App"; - - public const string DbSchema = null; -} +using Volo.Abp.Identity; + +namespace Acme.BookStore; + +public static class BookStoreConsts +{ + public const string DbTablePrefix = "App"; + public const string? DbSchema = null; + public const string AdminEmailDefaultValue = IdentityDataSeedContributor.AdminEmailDefaultValue; + public const string AdminPasswordDefaultValue = IdentityDataSeedContributor.AdminPasswordDefaultValue; +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDataSeederContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDataSeederContributor.cs index 62b6ca2e98..5e00729452 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDataSeederContributor.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDataSeederContributor.cs @@ -1,75 +1,75 @@ -using Acme.BookStore.Authors; -using Acme.BookStore.Books; -using System; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore; - -public class BookStoreDataSeederContributor - : IDataSeedContributor, ITransientDependency -{ - private readonly IRepository _bookRepository; - private readonly IAuthorRepository _authorRepository; - private readonly AuthorManager _authorManager; - - public BookStoreDataSeederContributor( - IRepository bookRepository, - IAuthorRepository authorRepository, - AuthorManager authorManager) - { - _bookRepository = bookRepository; - _authorRepository = authorRepository; - _authorManager = authorManager; - } - - public async Task SeedAsync(DataSeedContext context) - { - if (await _bookRepository.GetCountAsync() > 0) - { - return; - } - - var orwell = await _authorRepository.InsertAsync( - await _authorManager.CreateAsync( - "George Orwell", - new DateTime(1903, 06, 25), - "Orwell produced literary criticism and poetry, fiction and polemical journalism; and is best known for the allegorical novella Animal Farm (1945) and the dystopian novel Nineteen Eighty-Four (1949)." - ) - ); - - var douglas = await _authorRepository.InsertAsync( - await _authorManager.CreateAsync( - "Douglas Adams", - new DateTime(1952, 03, 11), - "Douglas Adams was an English author, screenwriter, essayist, humorist, satirist and dramatist. Adams was an advocate for environmentalism and conservation, a lover of fast cars, technological innovation and the Apple Macintosh, and a self-proclaimed 'radical atheist'." - ) - ); - - await _bookRepository.InsertAsync( - new Book - { - AuthorId = orwell.Id, // SET THE AUTHOR - Name = "1984", - Type = BookType.Dystopia, - PublishDate = new DateTime(1949, 6, 8), - Price = 19.84f - }, - autoSave: true - ); - - await _bookRepository.InsertAsync( - new Book - { - AuthorId = douglas.Id, // SET THE AUTHOR - Name = "The Hitchhiker's Guide to the Galaxy", - Type = BookType.ScienceFiction, - PublishDate = new DateTime(1995, 9, 27), - Price = 42.0f - }, - autoSave: true - ); - } -} +using System; +using System.Threading.Tasks; +using Acme.BookStore.Authors; +using Acme.BookStore.Books; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; + +namespace Acme.BookStore; + +public class BookStoreDataSeederContributor + : IDataSeedContributor, ITransientDependency +{ + private readonly IRepository _bookRepository; + private readonly IAuthorRepository _authorRepository; + private readonly AuthorManager _authorManager; + + public BookStoreDataSeederContributor( + IRepository bookRepository, + IAuthorRepository authorRepository, + AuthorManager authorManager) + { + _bookRepository = bookRepository; + _authorRepository = authorRepository; + _authorManager = authorManager; + } + + public async Task SeedAsync(DataSeedContext context) + { + if (await _bookRepository.GetCountAsync() > 0) + { + return; + } + + var orwell = await _authorRepository.InsertAsync( + await _authorManager.CreateAsync( + "George Orwell", + new DateTime(1903, 06, 25), + "Orwell produced literary criticism and poetry, fiction and polemical journalism; and is best known for the allegorical novella Animal Farm (1945) and the dystopian novel Nineteen Eighty-Four (1949)." + ) + ); + + var douglas = await _authorRepository.InsertAsync( + await _authorManager.CreateAsync( + "Douglas Adams", + new DateTime(1952, 03, 11), + "Douglas Adams was an English author, screenwriter, essayist, humorist, satirist and dramatist. Adams was an advocate for environmentalism and conservation, a lover of fast cars, technological innovation and the Apple Macintosh, and a self-proclaimed 'radical atheist'." + ) + ); + + await _bookRepository.InsertAsync( + new Book + { + AuthorId = orwell.Id, // SET THE AUTHOR + Name = "1984", + Type = BookType.Dystopia, + PublishDate = new DateTime(1949, 6, 8), + Price = 19.84f + }, + autoSave: true + ); + + await _bookRepository.InsertAsync( + new Book + { + AuthorId = douglas.Id, // SET THE AUTHOR + Name = "The Hitchhiker's Guide to the Galaxy", + Type = BookType.ScienceFiction, + PublishDate = new DateTime(1995, 9, 27), + Price = 42.0f + }, + autoSave: true + ); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs index 53454a397c..29f4212269 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs @@ -1,67 +1,60 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Acme.BookStore.MultiTenancy; -using Volo.Abp.AuditLogging; -using Volo.Abp.BackgroundJobs; -using Volo.Abp.Emailing; -using Volo.Abp.FeatureManagement; -using Volo.Abp.Identity; -using Volo.Abp.Localization; -using Volo.Abp.Modularity; -using Volo.Abp.MultiTenancy; -using Volo.Abp.OpenIddict; -using Volo.Abp.PermissionManagement.Identity; -using Volo.Abp.PermissionManagement.OpenIddict; -using Volo.Abp.SettingManagement; -using Volo.Abp.TenantManagement; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreDomainSharedModule), - typeof(AbpAuditLoggingDomainModule), - typeof(AbpBackgroundJobsDomainModule), - typeof(AbpFeatureManagementDomainModule), - typeof(AbpIdentityDomainModule), - typeof(AbpOpenIddictDomainModule), - typeof(AbpPermissionManagementDomainOpenIddictModule), - typeof(AbpPermissionManagementDomainIdentityModule), - typeof(AbpSettingManagementDomainModule), - typeof(AbpTenantManagementDomainModule), - typeof(AbpEmailingModule) -)] -public class BookStoreDomainModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); - options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); - options.Languages.Add(new LanguageInfo("en", "en", "English")); - options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); - options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); - options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); - options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); - options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi")); - options.Languages.Add(new LanguageInfo("it", "it", "Italiano")); - options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); - options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); - options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak")); - options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); - options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); - options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); - options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch")); - options.Languages.Add(new LanguageInfo("es", "es", "Español")); - }); - - Configure(options => - { - options.IsEnabled = MultiTenancyConsts.IsEnabled; - }); - -#if DEBUG - context.Services.Replace(ServiceDescriptor.Singleton()); -#endif - } -} +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Acme.BookStore.Localization; +using Acme.BookStore.MultiTenancy; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.SettingManagement; +using Volo.Abp.BlobStoring.Database; +using Volo.Abp.Caching; +using Volo.Abp.OpenIddict; +using Volo.Abp.PermissionManagement.OpenIddict; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.Emailing; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Commercial.SuiteTemplates; +using Volo.Abp.LanguageManagement; +using Volo.Abp.TextTemplateManagement; +using Volo.Saas; +using Volo.Abp.Gdpr; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreDomainSharedModule), + typeof(AbpAuditLoggingDomainModule), + typeof(AbpCachingModule), + typeof(AbpBackgroundJobsDomainModule), + typeof(AbpFeatureManagementDomainModule), + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpPermissionManagementDomainOpenIddictModule), + typeof(AbpSettingManagementDomainModule), + typeof(AbpEmailingModule), + typeof(AbpIdentityProDomainModule), + typeof(AbpOpenIddictProDomainModule), + typeof(SaasDomainModule), + typeof(TextTemplateManagementDomainModule), + typeof(LanguageManagementDomainModule), + typeof(VoloAbpCommercialSuiteTemplatesModule), + typeof(AbpGdprDomainModule), + typeof(BlobStoringDatabaseDomainModule) + )] +public class BookStoreDomainModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.IsEnabled = MultiTenancyConsts.IsEnabled; + }); + + +#if DEBUG + context.Services.Replace(ServiceDescriptor.Singleton()); +#endif + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Books/Book.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Books/Book.cs index e5d554f736..5d84904a86 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Books/Book.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Books/Book.cs @@ -1,17 +1,16 @@ -using System; -using Volo.Abp.Domain.Entities.Auditing; - -namespace Acme.BookStore.Books; - -public class Book : AuditedAggregateRoot -{ - public Guid AuthorId { get; set; } - - public string Name { get; set; } - - public BookType Type { get; set; } - - public DateTime PublishDate { get; set; } - - public float Price { get; set; } -} +using System; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Acme.BookStore.Books; +public class Book : AuditedAggregateRoot +{ + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } + + public Guid AuthorId { get; set; } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs index 587033542b..7320d7a59a 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs @@ -1,219 +1,226 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Identity; -using Volo.Abp.MultiTenancy; -using Volo.Abp.TenantManagement; - -namespace Acme.BookStore.Data; - -public class BookStoreDbMigrationService : ITransientDependency -{ - public ILogger Logger { get; set; } - - private readonly IDataSeeder _dataSeeder; - private readonly IEnumerable _dbSchemaMigrators; - private readonly ITenantRepository _tenantRepository; - private readonly ICurrentTenant _currentTenant; - - public BookStoreDbMigrationService( - IDataSeeder dataSeeder, - IEnumerable dbSchemaMigrators, - ITenantRepository tenantRepository, - ICurrentTenant currentTenant) - { - _dataSeeder = dataSeeder; - _dbSchemaMigrators = dbSchemaMigrators; - _tenantRepository = tenantRepository; - _currentTenant = currentTenant; - - Logger = NullLogger.Instance; - } - - public async Task MigrateAsync() - { - var initialMigrationAdded = AddInitialMigrationIfNotExist(); - - if (initialMigrationAdded) - { - return; - } - - Logger.LogInformation("Started database migrations..."); - - await MigrateDatabaseSchemaAsync(); - await SeedDataAsync(); - - Logger.LogInformation($"Successfully completed host database migrations."); - - var tenants = await _tenantRepository.GetListAsync(includeDetails: true); - - var migratedDatabaseSchemas = new HashSet(); - foreach (var tenant in tenants) - { - using (_currentTenant.Change(tenant.Id)) - { - if (tenant.ConnectionStrings.Any()) - { - var tenantConnectionStrings = tenant.ConnectionStrings - .Select(x => x.Value) - .ToList(); - - if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) - { - await MigrateDatabaseSchemaAsync(tenant); - - migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); - } - } - - await SeedDataAsync(tenant); - } - - Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); - } - - Logger.LogInformation("Successfully completed all database migrations."); - Logger.LogInformation("You can safely end this process..."); - } - - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) - { - Logger.LogInformation( - $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); - - foreach (var migrator in _dbSchemaMigrators) - { - await migrator.MigrateAsync(); - } - } - - private async Task SeedDataAsync(Tenant tenant = null) - { - Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); - - await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) - .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) - .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) - ); - } - - private bool AddInitialMigrationIfNotExist() - { - try - { - if (!DbMigrationsProjectExists()) - { - return false; - } - } - catch (Exception) - { - return false; - } - - try - { - if (!MigrationsFolderExists()) - { - AddInitialMigration(); - return true; - } - else - { - return false; - } - } - catch (Exception e) - { - Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); - return false; - } - } - - private bool DbMigrationsProjectExists() - { - var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); - - return dbMigrationsProjectFolder != null; - } - - private bool MigrationsFolderExists() - { - var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); - - return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); - } - - private void AddInitialMigration() - { - Logger.LogInformation("Creating initial migration..."); - - string argumentPrefix; - string fileName; - - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - argumentPrefix = "-c"; - fileName = "/bin/bash"; - } - else - { - argumentPrefix = "/C"; - fileName = "cmd.exe"; - } - - var procStartInfo = new ProcessStartInfo(fileName, - $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" - ); - - try - { - Process.Start(procStartInfo); - } - catch (Exception) - { - throw new Exception("Couldn't run ABP CLI..."); - } - } - - private string GetEntityFrameworkCoreProjectFolderPath() - { - var slnDirectoryPath = GetSolutionDirectoryPath(); - - if (slnDirectoryPath == null) - { - throw new Exception("Solution folder not found!"); - } - - var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); - - return Directory.GetDirectories(srcDirectoryPath) - .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); - } - - private string GetSolutionDirectoryPath() - { - var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - - while (Directory.GetParent(currentDirectory.FullName) != null) - { - currentDirectory = Directory.GetParent(currentDirectory.FullName); - - if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) - { - return currentDirectory.FullName; - } - } - - return null; - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; +using Volo.Abp.MultiTenancy; +using Acme.BookStore.MultiTenancy; +using Volo.Saas.Tenants; + +namespace Acme.BookStore.Data; + +public class BookStoreDbMigrationService : ITransientDependency +{ + public ILogger Logger { get; set; } + + private readonly IDataSeeder _dataSeeder; + private readonly IEnumerable _dbSchemaMigrators; + private readonly ITenantRepository _tenantRepository; + private readonly ICurrentTenant _currentTenant; + + public BookStoreDbMigrationService( + IDataSeeder dataSeeder, + ITenantRepository tenantRepository, + ICurrentTenant currentTenant, + IEnumerable dbSchemaMigrators) + { + _dataSeeder = dataSeeder; + _tenantRepository = tenantRepository; + _currentTenant = currentTenant; + _dbSchemaMigrators = dbSchemaMigrators; + + Logger = NullLogger.Instance; + } + + public async Task MigrateAsync() + { + var initialMigrationAdded = AddInitialMigrationIfNotExist(); + + if (initialMigrationAdded) + { + return; + } + + Logger.LogInformation("Started database migrations..."); + + await MigrateDatabaseSchemaAsync(); + await SeedDataAsync(); + + Logger.LogInformation($"Successfully completed host database migrations."); + + if (MultiTenancyConsts.IsEnabled) + { + + var tenants = await _tenantRepository.GetListAsync(includeDetails: true); + + var migratedDatabaseSchemas = new HashSet(); + foreach (var tenant in tenants) + { + using (_currentTenant.Change(tenant.Id)) + { + if (tenant.ConnectionStrings.Any()) + { + var tenantConnectionStrings = tenant.ConnectionStrings + .Select(x => x.Value) + .ToList(); + + if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) + { + await MigrateDatabaseSchemaAsync(tenant); + + migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); + } + } + + await SeedDataAsync(tenant); + } + + Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); + } + + Logger.LogInformation("Successfully completed all database migrations."); + } + Logger.LogInformation("You can safely end this process..."); + } + + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) + { + Logger.LogInformation( + $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); + + foreach (var migrator in _dbSchemaMigrators) + { + await migrator.MigrateAsync(); + } + } + + private async Task SeedDataAsync(Tenant? tenant = null) + { + Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); + + await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) + .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, + BookStoreConsts.AdminEmailDefaultValue) + .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, + BookStoreConsts.AdminPasswordDefaultValue) + ); + } + + private bool AddInitialMigrationIfNotExist() + { + try + { + if (!DbMigrationsProjectExists()) + { + return false; + } + } + catch (Exception) + { + return false; + } + + try + { + if (!MigrationsFolderExists()) + { + AddInitialMigration(); + return true; + } + else + { + return false; + } + } + catch (Exception e) + { + Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); + return false; + } + } + + private bool DbMigrationsProjectExists() + { + var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + + return dbMigrationsProjectFolder != null; + } + + private bool MigrationsFolderExists() + { + var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + + return dbMigrationsProjectFolder != null && Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); + } + + private void AddInitialMigration() + { + Logger.LogInformation("Creating initial migration..."); + + string argumentPrefix; + string fileName; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + argumentPrefix = "-c"; + fileName = "/bin/bash"; + } + else + { + argumentPrefix = "/C"; + fileName = "cmd.exe"; + } + + var procStartInfo = new ProcessStartInfo(fileName, + $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" + ); + + try + { + Process.Start(procStartInfo); + } + catch (Exception) + { + throw new Exception("Couldn't run ABP CLI..."); + } + } + + private string? GetEntityFrameworkCoreProjectFolderPath() + { + var slnDirectoryPath = GetSolutionDirectoryPath(); + + if (slnDirectoryPath == null) + { + throw new Exception("Solution folder not found!"); + } + + var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); + + return Directory.GetDirectories(srcDirectoryPath) + .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); + } + + private string? GetSolutionDirectoryPath() + { + var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); + + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) + { + currentDirectory = Directory.GetParent(currentDirectory.FullName); + + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + { + return currentDirectory.FullName; + } + } + + return null; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreTenantDatabaseMigrationHandler.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreTenantDatabaseMigrationHandler.cs new file mode 100644 index 0000000000..e908c1e1ee --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/BookStoreTenantDatabaseMigrationHandler.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Identity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace Acme.BookStore.Data; + +public class BookStoreTenantDatabaseMigrationHandler : + IDistributedEventHandler, + IDistributedEventHandler, + IDistributedEventHandler, + ITransientDependency +{ + private readonly IEnumerable _dbSchemaMigrators; + private readonly ICurrentTenant _currentTenant; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly IDataSeeder _dataSeeder; + private readonly ITenantStore _tenantStore; + private readonly ILogger _logger; + + public BookStoreTenantDatabaseMigrationHandler( + IEnumerable dbSchemaMigrators, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IDataSeeder dataSeeder, + ITenantStore tenantStore, + ILogger logger) + { + _dbSchemaMigrators = dbSchemaMigrators; + _currentTenant = currentTenant; + _unitOfWorkManager = unitOfWorkManager; + _dataSeeder = dataSeeder; + _tenantStore = tenantStore; + _logger = logger; + } + + public async Task HandleEventAsync(TenantCreatedEto eventData) + { + await MigrateAndSeedForTenantAsync( + eventData.Id, + eventData.Properties.GetOrDefault("AdminEmail") ?? BookStoreConsts.AdminEmailDefaultValue, + eventData.Properties.GetOrDefault("AdminPassword") ?? BookStoreConsts.AdminPasswordDefaultValue + ); + } + + public async Task HandleEventAsync(TenantConnectionStringUpdatedEto eventData) + { + if (eventData.ConnectionStringName != ConnectionStrings.DefaultConnectionStringName || + eventData.NewValue.IsNullOrWhiteSpace()) + { + return; + } + + await MigrateAndSeedForTenantAsync( + eventData.Id, + BookStoreConsts.AdminEmailDefaultValue, + BookStoreConsts.AdminPasswordDefaultValue + ); + + /* You may want to move your data from the old database to the new database! + * It is up to you. If you don't make it, new database will be empty + * (and tenant's admin password is reset to 1q2w3E*). + */ + } + + public async Task HandleEventAsync(ApplyDatabaseMigrationsEto eventData) + { + if (eventData.TenantId == null) + { + return; + } + + await MigrateAndSeedForTenantAsync( + eventData.TenantId.Value, + BookStoreConsts.AdminEmailDefaultValue, + BookStoreConsts.AdminPasswordDefaultValue + ); + } + + private async Task MigrateAndSeedForTenantAsync( + Guid tenantId, + string adminEmail, + string adminPassword) + { + try + { + using (_currentTenant.Change(tenantId)) + { + // Create database tables if needed + using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) + { + var tenantConfiguration = await _tenantStore.FindAsync(tenantId); + if (tenantConfiguration?.ConnectionStrings != null && + !tenantConfiguration.ConnectionStrings.Default.IsNullOrWhiteSpace()) + { + foreach (var migrator in _dbSchemaMigrators) + { + await migrator.MigrateAsync(); + } + } + + await uow.CompleteAsync(); + } + + // Seed data + using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: true)) + { + await _dataSeeder.SeedAsync( + new DataSeedContext(tenantId) + .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, adminEmail) + .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, adminPassword) + ); + + await uow.CompleteAsync(); + } + } + } + catch (Exception ex) + { + _logger.LogException(ex); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs index 0b95dba009..5e11865c87 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs @@ -1,8 +1,8 @@ -using System.Threading.Tasks; - -namespace Acme.BookStore.Data; - -public interface IBookStoreDbSchemaMigrator -{ - Task MigrateAsync(); -} +using System.Threading.Tasks; + +namespace Acme.BookStore.Data; + +public interface IBookStoreDbSchemaMigrator +{ + Task MigrateAsync(); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs index 0e01b973fd..3fc8fa11df 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs @@ -1,15 +1,15 @@ -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Acme.BookStore.Data; - -/* This is used if database provider does't define - * IBookStoreDbSchemaMigrator implementation. - */ -public class NullBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITransientDependency -{ - public Task MigrateAsync() - { - return Task.CompletedTask; - } -} +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Acme.BookStore.Data; + +/* This is used if database provider does't define + * IBookStoreDbSchemaMigrator implementation. + */ +public class NullBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITransientDependency +{ + public Task MigrateAsync() + { + return Task.CompletedTask; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Identity/ChangeIdentityPasswordPolicySettingDefinitionProvider.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Identity/ChangeIdentityPasswordPolicySettingDefinitionProvider.cs new file mode 100644 index 0000000000..6b3bc6f3e5 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Identity/ChangeIdentityPasswordPolicySettingDefinitionProvider.cs @@ -0,0 +1,34 @@ +using Volo.Abp.Identity.Settings; +using Volo.Abp.Settings; + +namespace Acme.BookStore.Identity; + +public class ChangeIdentityPasswordPolicySettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + var requireNonAlphanumeric = context.GetOrNull(IdentitySettingNames.Password.RequireNonAlphanumeric); + if (requireNonAlphanumeric != null) + { + requireNonAlphanumeric.DefaultValue = false.ToString(); + } + + var requireLowercase = context.GetOrNull(IdentitySettingNames.Password.RequireLowercase); + if (requireLowercase != null) + { + requireLowercase.DefaultValue = false.ToString(); + } + + var requireUppercase = context.GetOrNull(IdentitySettingNames.Password.RequireUppercase); + if (requireUppercase != null) + { + requireUppercase.DefaultValue = false.ToString(); + } + + var requireDigit = context.GetOrNull(IdentitySettingNames.Password.RequireDigit); + if (requireDigit != null) + { + requireDigit.DefaultValue = false.ToString(); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/OpenIddict/OpenIddictDataSeedContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/OpenIddict/OpenIddictDataSeedContributor.cs index bdab3e68c3..6d46c01b55 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/OpenIddict/OpenIddictDataSeedContributor.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/OpenIddict/OpenIddictDataSeedContributor.cs @@ -1,390 +1,390 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using JetBrains.Annotations; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Localization; -using OpenIddict.Abstractions; -using Volo.Abp; -using Volo.Abp.Authorization.Permissions; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.OpenIddict.Applications; -using Volo.Abp.PermissionManagement; -using Volo.Abp.Uow; - -namespace Acme.BookStore.OpenIddict; - -/* Creates initial data that is needed to property run the application - * and make client-to-server communication possible. - */ -public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency -{ - private readonly IConfiguration _configuration; - private readonly IAbpApplicationManager _applicationManager; - private readonly IOpenIddictScopeManager _scopeManager; - private readonly IPermissionDataSeeder _permissionDataSeeder; - private readonly IStringLocalizer L; - - public OpenIddictDataSeedContributor( - IConfiguration configuration, - IAbpApplicationManager applicationManager, - IOpenIddictScopeManager scopeManager, - IPermissionDataSeeder permissionDataSeeder, - IStringLocalizer l) - { - _configuration = configuration; - _applicationManager = applicationManager; - _scopeManager = scopeManager; - _permissionDataSeeder = permissionDataSeeder; - L = l; - } - - [UnitOfWork] - public virtual async Task SeedAsync(DataSeedContext context) - { - await CreateScopesAsync(); - await CreateApplicationsAsync(); - } - - private async Task CreateScopesAsync() - { - if (await _scopeManager.FindByNameAsync("BookStore") == null) - { - await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor - { - Name = "BookStore", - DisplayName = "BookStore API", - Resources = - { - "BookStore" - } - }); - } - } - - private async Task CreateApplicationsAsync() - { - var commonScopes = new List - { - OpenIddictConstants.Permissions.Scopes.Address, - OpenIddictConstants.Permissions.Scopes.Email, - OpenIddictConstants.Permissions.Scopes.Phone, - OpenIddictConstants.Permissions.Scopes.Profile, - OpenIddictConstants.Permissions.Scopes.Roles, - "BookStore" - }; - - var configurationSection = _configuration.GetSection("OpenIddict:Applications"); - - //Web Client - var webClientId = configurationSection["BookStore_Web:ClientId"]; - if (!webClientId.IsNullOrWhiteSpace()) - { - var webClientRootUrl = configurationSection["BookStore_Web:RootUrl"].EnsureEndsWith('/'); - - /* BookStore_Web client is only needed if you created a tiered - * solution. Otherwise, you can delete this client. */ - await CreateApplicationAsync( - name: webClientId, - type: OpenIddictConstants.ClientTypes.Confidential, - consentType: OpenIddictConstants.ConsentTypes.Implicit, - displayName: "Web Application", - secret: configurationSection["BookStore_Web:ClientSecret"] ?? "1q2w3e*", - grantTypes: new List //Hybrid flow - { - OpenIddictConstants.GrantTypes.AuthorizationCode, - OpenIddictConstants.GrantTypes.Implicit - }, - scopes: commonScopes, - redirectUri: $"{webClientRootUrl}signin-oidc", - clientUri: webClientRootUrl, - postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc" - ); - } - - //Console Test / Angular Client - var consoleAndAngularClientId = configurationSection["BookStore_App:ClientId"]; - if (!consoleAndAngularClientId.IsNullOrWhiteSpace()) - { - var consoleAndAngularClientRootUrl = configurationSection["BookStore_App:RootUrl"]?.TrimEnd('/'); - await CreateApplicationAsync( - name: consoleAndAngularClientId, - type: OpenIddictConstants.ClientTypes.Public, - consentType: OpenIddictConstants.ConsentTypes.Implicit, - displayName: "Console Test / Angular Application", - secret: null, - grantTypes: new List - { - OpenIddictConstants.GrantTypes.AuthorizationCode, - OpenIddictConstants.GrantTypes.Password, - OpenIddictConstants.GrantTypes.ClientCredentials, - OpenIddictConstants.GrantTypes.RefreshToken - }, - scopes: commonScopes, - redirectUri: consoleAndAngularClientRootUrl, - clientUri: consoleAndAngularClientRootUrl, - postLogoutRedirectUri: consoleAndAngularClientRootUrl - ); - } - - // Blazor Client - var blazorClientId = configurationSection["BookStore_Blazor:ClientId"]; - if (!blazorClientId.IsNullOrWhiteSpace()) - { - var blazorRootUrl = configurationSection["BookStore_Blazor:RootUrl"].TrimEnd('/'); - - await CreateApplicationAsync( - name: blazorClientId, - type: OpenIddictConstants.ClientTypes.Public, - consentType: OpenIddictConstants.ConsentTypes.Implicit, - displayName: "Blazor Application", - secret: null, - grantTypes: new List - { - OpenIddictConstants.GrantTypes.AuthorizationCode, - }, - scopes: commonScopes, - redirectUri: $"{blazorRootUrl}/authentication/login-callback", - clientUri: blazorRootUrl, - postLogoutRedirectUri: $"{blazorRootUrl}/authentication/logout-callback" - ); - } - - // Blazor Server Tiered Client - var blazorServerTieredClientId = configurationSection["BookStore_BlazorServerTiered:ClientId"]; - if (!blazorServerTieredClientId.IsNullOrWhiteSpace()) - { - var blazorServerTieredRootUrl = configurationSection["BookStore_BlazorServerTiered:RootUrl"].EnsureEndsWith('/'); - - await CreateApplicationAsync( - name: blazorServerTieredClientId, - type: OpenIddictConstants.ClientTypes.Confidential, - consentType: OpenIddictConstants.ConsentTypes.Implicit, - displayName: "Blazor Server Application", - secret: configurationSection["BookStore_BlazorServerTiered:ClientSecret"] ?? "1q2w3e*", - grantTypes: new List //Hybrid flow - { - OpenIddictConstants.GrantTypes.AuthorizationCode, - OpenIddictConstants.GrantTypes.Implicit - }, - scopes: commonScopes, - redirectUri: $"{blazorServerTieredRootUrl}signin-oidc", - clientUri: blazorServerTieredRootUrl, - postLogoutRedirectUri: $"{blazorServerTieredRootUrl}signout-callback-oidc" - ); - } - - // Swagger Client - var swaggerClientId = configurationSection["BookStore_Swagger:ClientId"]; - if (!swaggerClientId.IsNullOrWhiteSpace()) - { - var swaggerRootUrl = configurationSection["BookStore_Swagger:RootUrl"].TrimEnd('/'); - - await CreateApplicationAsync( - name: swaggerClientId, - type: OpenIddictConstants.ClientTypes.Public, - consentType: OpenIddictConstants.ConsentTypes.Implicit, - displayName: "Swagger Application", - secret: null, - grantTypes: new List - { - OpenIddictConstants.GrantTypes.AuthorizationCode, - }, - scopes: commonScopes, - redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html", - clientUri: swaggerRootUrl - ); - } - } - - private async Task CreateApplicationAsync( - [NotNull] string name, - [NotNull] string type, - [NotNull] string consentType, - string displayName, - string secret, - List grantTypes, - List scopes, - string clientUri = null, - string redirectUri = null, - string postLogoutRedirectUri = null, - List permissions = null) - { - if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) - { - throw new BusinessException(L["NoClientSecretCanBeSetForPublicApplications"]); - } - - if (string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Confidential, StringComparison.OrdinalIgnoreCase)) - { - throw new BusinessException(L["TheClientSecretIsRequiredForConfidentialApplications"]); - } - - if (!string.IsNullOrEmpty(name) && await _applicationManager.FindByClientIdAsync(name) != null) - { - return; - //throw new BusinessException(L["TheClientIdentifierIsAlreadyTakenByAnotherApplication"]); - } - - var client = await _applicationManager.FindByClientIdAsync(name); - if (client == null) - { - var application = new AbpApplicationDescriptor - { - ClientId = name, - ClientType = type, - ClientSecret = secret, - ConsentType = consentType, - DisplayName = displayName, - ClientUri = clientUri, - }; - - Check.NotNullOrEmpty(grantTypes, nameof(grantTypes)); - Check.NotNullOrEmpty(scopes, nameof(scopes)); - - if (new [] { OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit }.All(grantTypes.Contains)) - { - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken); - - if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) - { - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken); - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeToken); - } - } - - if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) - { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); - } - - foreach (var grantType in grantTypes) - { - if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode) - { - application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode); - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Code); - } - - if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || grantType == OpenIddictConstants.GrantTypes.Implicit) - { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Authorization); - } - - if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || - grantType == OpenIddictConstants.GrantTypes.ClientCredentials || - grantType == OpenIddictConstants.GrantTypes.Password || - grantType == OpenIddictConstants.GrantTypes.RefreshToken || - grantType == OpenIddictConstants.GrantTypes.DeviceCode) - { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); - } - - if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) - { - application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.ClientCredentials); - } - - if (grantType == OpenIddictConstants.GrantTypes.Implicit) - { - application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Implicit); - } - - if (grantType == OpenIddictConstants.GrantTypes.Password) - { - application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Password); - } - - if (grantType == OpenIddictConstants.GrantTypes.RefreshToken) - { - application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); - } - - if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) - { - application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); - } - - if (grantType == OpenIddictConstants.GrantTypes.Implicit) - { - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); - if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) - { - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken); - application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Token); - } - } - } - - var buildInScopes = new [] - { - OpenIddictConstants.Permissions.Scopes.Address, - OpenIddictConstants.Permissions.Scopes.Email, - OpenIddictConstants.Permissions.Scopes.Phone, - OpenIddictConstants.Permissions.Scopes.Profile, - OpenIddictConstants.Permissions.Scopes.Roles - }; - - foreach (var scope in scopes) - { - if (buildInScopes.Contains(scope)) - { - application.Permissions.Add(scope); - } - else - { - application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.Scope + scope); - } - } - - if (redirectUri != null) - { - if (!redirectUri.IsNullOrEmpty()) - { - if (!Uri.TryCreate(redirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) - { - throw new BusinessException(L["InvalidRedirectUri", redirectUri]); - } - - if (application.RedirectUris.All(x => x != uri)) - { - application.RedirectUris.Add(uri); - } - } - } - - if (postLogoutRedirectUri != null) - { - if (!postLogoutRedirectUri.IsNullOrEmpty()) - { - if (!Uri.TryCreate(postLogoutRedirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) - { - throw new BusinessException(L["InvalidPostLogoutRedirectUri", postLogoutRedirectUri]); - } - - if (application.PostLogoutRedirectUris.All(x => x != uri)) - { - application.PostLogoutRedirectUris.Add(uri); - } - } - } - - if (permissions != null) - { - await _permissionDataSeeder.SeedAsync( - ClientPermissionValueProvider.ProviderName, - name, - permissions, - null - ); - } - - await _applicationManager.CreateAsync(application); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Localization; +using OpenIddict.Abstractions; +using Volo.Abp; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.OpenIddict.Applications; +using Volo.Abp.OpenIddict.Scopes; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; + +namespace Acme.BookStore.OpenIddict; + +/* Creates initial data that is needed to property run the application + * and make client-to-server communication possible. + */ +public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IConfiguration _configuration; + private readonly IOpenIddictApplicationRepository _openIddictApplicationRepository; + private readonly IAbpApplicationManager _applicationManager; + private readonly IOpenIddictScopeRepository _openIddictScopeRepository; + private readonly IOpenIddictScopeManager _scopeManager; + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IStringLocalizer L; + + public OpenIddictDataSeedContributor( + IConfiguration configuration, + IOpenIddictApplicationRepository openIddictApplicationRepository, + IAbpApplicationManager applicationManager, + IOpenIddictScopeRepository openIddictScopeRepository, + IOpenIddictScopeManager scopeManager, + IPermissionDataSeeder permissionDataSeeder, + IStringLocalizer l) + { + _configuration = configuration; + _openIddictApplicationRepository = openIddictApplicationRepository; + _applicationManager = applicationManager; + _openIddictScopeRepository = openIddictScopeRepository; + _scopeManager = scopeManager; + _permissionDataSeeder = permissionDataSeeder; + L = l; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + await CreateScopesAsync(); + await CreateApplicationsAsync(); + } + + private async Task CreateScopesAsync() + { + if (await _openIddictScopeRepository.FindByNameAsync("BookStore") == null) + { + await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor { + Name = "BookStore", DisplayName = "BookStore API", Resources = { "BookStore" } + }); + } + } + + private async Task CreateApplicationsAsync() + { + var commonScopes = new List { + OpenIddictConstants.Permissions.Scopes.Address, + OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Phone, + OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Roles, + "BookStore" + }; + + var configurationSection = _configuration.GetSection("OpenIddict:Applications"); + + + //Console Test / Angular Client + var consoleAndAngularClientId = configurationSection["BookStore_App:ClientId"]; + if (!consoleAndAngularClientId.IsNullOrWhiteSpace()) + { + var consoleAndAngularClientRootUrl = configurationSection["BookStore_App:RootUrl"]?.TrimEnd('/'); + await CreateApplicationAsync( + applicationType: OpenIddictConstants.ApplicationTypes.Web, + name: consoleAndAngularClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Console Test / Angular Application", + secret: null, + grantTypes: new List { + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.Password, + OpenIddictConstants.GrantTypes.ClientCredentials, + OpenIddictConstants.GrantTypes.RefreshToken, + "LinkLogin", + "Impersonation" + }, + scopes: commonScopes, + redirectUris: new List { consoleAndAngularClientRootUrl }, + postLogoutRedirectUris: new List { consoleAndAngularClientRootUrl }, + clientUri: consoleAndAngularClientRootUrl, + logoUri: "/images/clients/angular.svg" + ); + } + + + + + // Blazor Client + var blazorClientId = configurationSection["BookStore_Blazor:ClientId"]; + if (!blazorClientId.IsNullOrWhiteSpace()) + { + var blazorRootUrl = configurationSection["BookStore_Blazor:RootUrl"]?.TrimEnd('/'); + + await CreateApplicationAsync( + applicationType: OpenIddictConstants.ApplicationTypes.Web, + name: blazorClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Blazor Application", + secret: null, + grantTypes: new List { + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.RefreshToken, + }, + scopes: commonScopes, + redirectUris: new List { $"{blazorRootUrl}/authentication/login-callback" }, + postLogoutRedirectUris: new List { $"{blazorRootUrl}/authentication/logout-callback" }, + clientUri: blazorRootUrl, + logoUri: "/images/clients/blazor.svg" + ); + } + + + + // Swagger Client + var swaggerClientId = configurationSection["BookStore_Swagger:ClientId"]; + if (!swaggerClientId.IsNullOrWhiteSpace()) + { + var swaggerRootUrl = configurationSection["BookStore_Swagger:RootUrl"]?.TrimEnd('/'); + + await CreateApplicationAsync( + applicationType: OpenIddictConstants.ApplicationTypes.Web, + name: swaggerClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Swagger Application", + secret: null, + grantTypes: new List { OpenIddictConstants.GrantTypes.AuthorizationCode, }, + scopes: commonScopes, + redirectUris: new List { $"{swaggerRootUrl}/swagger/oauth2-redirect.html" }, + clientUri: swaggerRootUrl.EnsureEndsWith('/') + "swagger", + logoUri: "/images/clients/swagger.svg" + ); + } + + + } + + private async Task CreateApplicationAsync( + [NotNull] string applicationType, + [NotNull] string name, + [NotNull] string type, + [NotNull] string consentType, + string displayName, + string? secret, + List grantTypes, + List scopes, + List? redirectUris = null, + List? postLogoutRedirectUris = null, + List? permissions = null, + string? clientUri = null, + string? logoUri = null) + { + if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, + StringComparison.OrdinalIgnoreCase)) + { + throw new BusinessException(L["NoClientSecretCanBeSetForPublicApplications"]); + } + + if (string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Confidential, + StringComparison.OrdinalIgnoreCase)) + { + throw new BusinessException(L["TheClientSecretIsRequiredForConfidentialApplications"]); + } + + var client = await _openIddictApplicationRepository.FindByClientIdAsync(name); + + var application = new AbpApplicationDescriptor { + ApplicationType = applicationType, + ClientId = name, + ClientType = type, + ClientSecret = secret, + ConsentType = consentType, + DisplayName = displayName, + ClientUri = clientUri, + LogoUri = logoUri, + }; + + Check.NotNullOrEmpty(grantTypes, nameof(grantTypes)); + Check.NotNullOrEmpty(scopes, nameof(scopes)); + + if (new[] { OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit }.All( + grantTypes.Contains)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken); + + if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeToken); + } + } + + if (!redirectUris.IsNullOrEmpty() || !postLogoutRedirectUris.IsNullOrEmpty()) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); + } + + var buildInGrantTypes = new[] { + OpenIddictConstants.GrantTypes.Implicit, OpenIddictConstants.GrantTypes.Password, + OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.ClientCredentials, + OpenIddictConstants.GrantTypes.DeviceCode, OpenIddictConstants.GrantTypes.RefreshToken + }; + + foreach (var grantType in grantTypes) + { + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Code); + } + + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || + grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Authorization); + } + + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || + grantType == OpenIddictConstants.GrantTypes.ClientCredentials || + grantType == OpenIddictConstants.GrantTypes.Password || + grantType == OpenIddictConstants.GrantTypes.RefreshToken || + grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); + } + + if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.ClientCredentials); + } + + if (grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Implicit); + } + + if (grantType == OpenIddictConstants.GrantTypes.Password) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Password); + } + + if (grantType == OpenIddictConstants.GrantTypes.RefreshToken) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); + } + + if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization); + } + + if (grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); + if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Token); + } + } + + if (!buildInGrantTypes.Contains(grantType)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.GrantType + grantType); + } + } + + var buildInScopes = new[] { + OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Roles + }; + + foreach (var scope in scopes) + { + if (buildInScopes.Contains(scope)) + { + application.Permissions.Add(scope); + } + else + { + application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.Scope + scope); + } + } + + if (!redirectUris.IsNullOrEmpty()) + { + foreach (var redirectUri in redirectUris!.Where(redirectUri => !redirectUri.IsNullOrWhiteSpace())) + { + if (!Uri.TryCreate(redirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) + { + throw new BusinessException(L["InvalidRedirectUri", redirectUri]); + } + + if (application.RedirectUris.All(x => x != uri)) + { + application.RedirectUris.Add(uri); + } + } + + } + + if (!postLogoutRedirectUris.IsNullOrEmpty()) + { + foreach (var postLogoutRedirectUri in postLogoutRedirectUris!.Where(postLogoutRedirectUri => !postLogoutRedirectUri.IsNullOrWhiteSpace())) + { + if (!Uri.TryCreate(postLogoutRedirectUri, UriKind.Absolute, out var uri) || + !uri.IsWellFormedOriginalString()) + { + throw new BusinessException(L["InvalidPostLogoutRedirectUri", postLogoutRedirectUri]); + } + + if (application.PostLogoutRedirectUris.All(x => x != uri)) + { + application.PostLogoutRedirectUris.Add(uri); + } + } + } + + if (permissions != null) + { + await _permissionDataSeeder.SeedAsync( + ClientPermissionValueProvider.ProviderName, + name, + permissions, + null + ); + } + + if (client == null) + { + await _applicationManager.CreateAsync(application); + return; + } + + if (!HasSameRedirectUris(client, application)) + { + client.RedirectUris = JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().RemovePostFix("/"))); + client.PostLogoutRedirectUris = JsonSerializer.Serialize(application.PostLogoutRedirectUris.Select(q => q.ToString().RemovePostFix("/"))); + + await _applicationManager.UpdateAsync(client.ToModel()); + } + + if (!HasSameScopes(client, application)) + { + client.Permissions = JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString())); + await _applicationManager.UpdateAsync(client.ToModel()); + } + } + + private bool HasSameRedirectUris(OpenIddictApplication existingClient, AbpApplicationDescriptor application) + { + return existingClient.RedirectUris == JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().RemovePostFix("/"))); + } + + private bool HasSameScopes(OpenIddictApplication existingClient, AbpApplicationDescriptor application) + { + return existingClient.Permissions == JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString().TrimEnd('/'))); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Properties/AssemblyInfo.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Properties/AssemblyInfo.cs index 94d836f900..b98dfee448 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Properties/AssemblyInfo.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Properties/AssemblyInfo.cs @@ -1,3 +1,3 @@ -using System.Runtime.CompilerServices; -[assembly:InternalsVisibleToAttribute("Acme.BookStore.Domain.Tests")] -[assembly:InternalsVisibleToAttribute("Acme.BookStore.TestBase")] +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("Acme.BookStore.Domain.Tests")] +[assembly:InternalsVisibleToAttribute("Acme.BookStore.TestBase")] diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Saas/SaasDataSeedContributor.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Saas/SaasDataSeedContributor.cs new file mode 100644 index 0000000000..e042b9de52 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Saas/SaasDataSeedContributor.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; +using Volo.Saas.Editions; + +namespace Acme.BookStore.Saas; + +public class SaasDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IEditionDataSeeder _editionDataSeeder; + private readonly ICurrentTenant _currentTenant; + + public SaasDataSeedContributor(IEditionDataSeeder editionDataSeeder, ICurrentTenant currentTenant) + { + _editionDataSeeder = editionDataSeeder; + _currentTenant = currentTenant; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + using (_currentTenant.Change(context?.TenantId)) + { + await _editionDataSeeder.CreateStandardEditionsAsync(); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettingDefinitionProvider.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettingDefinitionProvider.cs index 10ab3158b2..c2add664f8 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettingDefinitionProvider.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettingDefinitionProvider.cs @@ -1,12 +1,12 @@ -using Volo.Abp.Settings; - -namespace Acme.BookStore.Settings; - -public class BookStoreSettingDefinitionProvider : SettingDefinitionProvider -{ - public override void Define(ISettingDefinitionContext context) - { - //Define your own settings here. Example: - //context.Add(new SettingDefinition(BookStoreSettings.MySetting1)); - } -} +using Volo.Abp.Settings; + +namespace Acme.BookStore.Settings; + +public class BookStoreSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + //Define your own settings here. Example: + //context.Add(new SettingDefinition(BookStoreSettings.MySetting1)); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettings.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettings.cs index b1aaea343e..80bc1892a8 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettings.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.Domain/Settings/BookStoreSettings.cs @@ -1,9 +1,9 @@ -namespace Acme.BookStore.Settings; - -public static class BookStoreSettings -{ - private const string Prefix = "BookStore"; - - //Add your own setting names here. Example: - //public const string MySetting1 = Prefix + ".MySetting1"; -} +namespace Acme.BookStore.Settings; + +public static class BookStoreSettings +{ + private const string Prefix = "BookStore"; + + //Add your own setting names here. Example: + //public const string MySetting1 = Prefix + ".MySetting1"; +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg new file mode 100644 index 0000000000..38c26ef3a7 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg.analyze.json new file mode 100644 index 0000000000..5fd01cfa5b --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.abppkg.analyze.json @@ -0,0 +1,226 @@ +{ + "name": "Acme.BookStore.EntityFrameworkCore", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore.EntityFrameworkCore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Acme.BookStore.Domain", + "namespace": "Acme.BookStore", + "name": "BookStoreDomainModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.EntityFrameworkCore", + "namespace": "Volo.Abp.PermissionManagement.EntityFrameworkCore", + "name": "AbpPermissionManagementEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.EntityFrameworkCore", + "namespace": "Volo.Abp.SettingManagement.EntityFrameworkCore", + "name": "AbpSettingManagementEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.EntityFrameworkCore.SqlServer", + "namespace": "Volo.Abp.EntityFrameworkCore.SqlServer", + "name": "AbpEntityFrameworkCoreSqlServerModule" + }, + { + "declaringAssemblyName": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", + "namespace": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", + "name": "AbpBackgroundJobsEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.EntityFrameworkCore", + "namespace": "Volo.Abp.AuditLogging.EntityFrameworkCore", + "name": "AbpAuditLoggingEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.EntityFrameworkCore", + "namespace": "Volo.Abp.FeatureManagement.EntityFrameworkCore", + "name": "AbpFeatureManagementEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.EntityFrameworkCore", + "namespace": "Volo.Abp.Identity.EntityFrameworkCore", + "name": "AbpIdentityProEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.EntityFrameworkCore", + "namespace": "Volo.Abp.OpenIddict.EntityFrameworkCore", + "name": "AbpOpenIddictProEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.EntityFrameworkCore", + "namespace": "Volo.Abp.LanguageManagement.EntityFrameworkCore", + "name": "LanguageManagementEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.EntityFrameworkCore", + "namespace": "Volo.Abp.TextTemplateManagement.EntityFrameworkCore", + "name": "TextTemplateManagementEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.EntityFrameworkCore", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprEntityFrameworkCoreModule" + }, + { + "declaringAssemblyName": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", + "namespace": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", + "name": "BlobStoringDatabaseEntityFrameworkCoreModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreEntityFrameworkCoreModule", + "summary": null + }, + { + "namespace": "Acme.BookStore.EntityFrameworkCore", + "connectionStringName": "Default", + "databaseTables": [], + "replacedDbContexts": [ + { + "name": "ISaasDbContext", + "namespace": "Volo.Saas.EntityFrameworkCore", + "declaringAssemblyName": "Volo.Saas.EntityFrameworkCore", + "fullName": "Volo.Saas.EntityFrameworkCore.ISaasDbContext" + }, + { + "name": "IIdentityProDbContext", + "namespace": "Volo.Abp.Identity.EntityFrameworkCore", + "declaringAssemblyName": "Volo.Abp.Identity.Pro.EntityFrameworkCore", + "fullName": "Volo.Abp.Identity.EntityFrameworkCore.IIdentityProDbContext" + } + ], + "modelBuilderExtensionMethods": [], + "implementingInterfaces": [ + { + "name": "IInfrastructure", + "namespace": "Microsoft.EntityFrameworkCore.Infrastructure", + "declaringAssemblyName": "Microsoft.EntityFrameworkCore", + "fullName": "Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure" + }, + { + "name": "IDbContextDependencies", + "namespace": "Microsoft.EntityFrameworkCore.Internal", + "declaringAssemblyName": "Microsoft.EntityFrameworkCore", + "fullName": "Microsoft.EntityFrameworkCore.Internal.IDbContextDependencies" + }, + { + "name": "IDbSetCache", + "namespace": "Microsoft.EntityFrameworkCore.Internal", + "declaringAssemblyName": "Microsoft.EntityFrameworkCore", + "fullName": "Microsoft.EntityFrameworkCore.Internal.IDbSetCache" + }, + { + "name": "IDbContextPoolable", + "namespace": "Microsoft.EntityFrameworkCore.Internal", + "declaringAssemblyName": "Microsoft.EntityFrameworkCore", + "fullName": "Microsoft.EntityFrameworkCore.Internal.IDbContextPoolable" + }, + { + "name": "IResettableService", + "namespace": "Microsoft.EntityFrameworkCore.Infrastructure", + "declaringAssemblyName": "Microsoft.EntityFrameworkCore", + "fullName": "Microsoft.EntityFrameworkCore.Infrastructure.IResettableService" + }, + { + "name": "IDisposable", + "namespace": "System", + "declaringAssemblyName": "System.Private.CoreLib", + "fullName": "System.IDisposable" + }, + { + "name": "IAsyncDisposable", + "namespace": "System", + "declaringAssemblyName": "System.Private.CoreLib", + "fullName": "System.IAsyncDisposable" + }, + { + "name": "IAbpEfCoreDbContext", + "namespace": "Volo.Abp.EntityFrameworkCore", + "declaringAssemblyName": "Volo.Abp.EntityFrameworkCore", + "fullName": "Volo.Abp.EntityFrameworkCore.IAbpEfCoreDbContext" + }, + { + "name": "IEfCoreDbContext", + "namespace": "Volo.Abp.EntityFrameworkCore", + "declaringAssemblyName": "Volo.Abp.EntityFrameworkCore", + "fullName": "Volo.Abp.EntityFrameworkCore.IEfCoreDbContext" + }, + { + "name": "IAbpEfCoreDbFunctionContext", + "namespace": "Volo.Abp.EntityFrameworkCore.GlobalFilters", + "declaringAssemblyName": "Volo.Abp.EntityFrameworkCore", + "fullName": "Volo.Abp.EntityFrameworkCore.GlobalFilters.IAbpEfCoreDbFunctionContext" + }, + { + "name": "ITransientDependency", + "namespace": "Volo.Abp.DependencyInjection", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.DependencyInjection.ITransientDependency" + }, + { + "name": "IIdentityProDbContext", + "namespace": "Volo.Abp.Identity.EntityFrameworkCore", + "declaringAssemblyName": "Volo.Abp.Identity.Pro.EntityFrameworkCore", + "fullName": "Volo.Abp.Identity.EntityFrameworkCore.IIdentityProDbContext" + }, + { + "name": "IIdentityDbContext", + "namespace": "Volo.Abp.Identity.EntityFrameworkCore", + "declaringAssemblyName": "Volo.Abp.Identity.EntityFrameworkCore", + "fullName": "Volo.Abp.Identity.EntityFrameworkCore.IIdentityDbContext" + } + ], + "contentType": "efCoreDbContext", + "name": "BookStoreDbContext", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj index 27d6c2ce95..73c4200058 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj @@ -1,30 +1,41 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + + + + + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers + compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Authors/EfCoreAuthorRepository.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Authors/EfCoreAuthorRepository.cs index dbd90b5945..e592e9baed 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Authors/EfCoreAuthorRepository.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Authors/EfCoreAuthorRepository.cs @@ -1,46 +1,46 @@ -using Acme.BookStore.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace Acme.BookStore.Authors; - -public class EfCoreAuthorRepository - : EfCoreRepository, - IAuthorRepository -{ - public EfCoreAuthorRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public async Task FindByNameAsync(string name) - { - var dbSet = await GetDbSetAsync(); - return await dbSet.FirstOrDefaultAsync(author => author.Name == name); - } - - public async Task> GetListAsync( - int skipCount, - int maxResultCount, - string sorting, - string filter = null) - { - var dbSet = await GetDbSetAsync(); - return await dbSet - .WhereIf( - !filter.IsNullOrWhiteSpace(), - author => author.Name.Contains(filter) - ) - .OrderBy(sorting) - .Skip(skipCount) - .Take(maxResultCount) - .ToListAsync(); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Acme.BookStore.Authors; + +public class EfCoreAuthorRepository + : EfCoreRepository, + IAuthorRepository +{ + public EfCoreAuthorRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task FindByNameAsync(string name) + { + var dbSet = await GetDbSetAsync(); + return await dbSet.FirstOrDefaultAsync(author => author.Name == name); + } + + public async Task> GetListAsync( + int skipCount, + int maxResultCount, + string sorting, + string filter = null) + { + var dbSet = await GetDbSetAsync(); + return await dbSet + .WhereIf( + !filter.IsNullOrWhiteSpace(), + author => author.Name.Contains(filter) + ) + .OrderBy(sorting) + .Skip(skipCount) + .Take(maxResultCount) + .ToListAsync(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs index 35ac4fd8c2..9caa00f011 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs @@ -1,112 +1,126 @@ -using Acme.BookStore.Authors; -using Acme.BookStore.Books; -using Microsoft.EntityFrameworkCore; -using Volo.Abp.AuditLogging.EntityFrameworkCore; -using Volo.Abp.BackgroundJobs.EntityFrameworkCore; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore.Modeling; -using Volo.Abp.FeatureManagement.EntityFrameworkCore; -using Volo.Abp.Identity; -using Volo.Abp.Identity.EntityFrameworkCore; -using Volo.Abp.OpenIddict.EntityFrameworkCore; -using Volo.Abp.PermissionManagement.EntityFrameworkCore; -using Volo.Abp.SettingManagement.EntityFrameworkCore; -using Volo.Abp.TenantManagement; -using Volo.Abp.TenantManagement.EntityFrameworkCore; - -namespace Acme.BookStore.EntityFrameworkCore; - -[ReplaceDbContext(typeof(IIdentityDbContext))] -[ReplaceDbContext(typeof(ITenantManagementDbContext))] -[ConnectionStringName("Default")] -public class BookStoreDbContext : - AbpDbContext, - IIdentityDbContext, - ITenantManagementDbContext -{ - /* Add DbSet properties for your Aggregate Roots / Entities here. */ - - #region Entities from the modules - - /* Notice: We only implemented IIdentityDbContext and ITenantManagementDbContext - * and replaced them for this DbContext. This allows you to perform JOIN - * queries for the entities of these modules over the repositories easily. You - * typically don't need that for other modules. But, if you need, you can - * implement the DbContext interface of the needed module and use ReplaceDbContext - * attribute just like IIdentityDbContext and ITenantManagementDbContext. - * - * More info: Replacing a DbContext of a module ensures that the related module - * uses this DbContext on runtime. Otherwise, it will use its own DbContext class. - */ - - //Identity - public DbSet Users { get; set; } - public DbSet Roles { get; set; } - public DbSet ClaimTypes { get; set; } - public DbSet OrganizationUnits { get; set; } - public DbSet SecurityLogs { get; set; } - public DbSet LinkUsers { get; set; } - public DbSet UserDelegations { get; set; } - public DbSet Sessions { get; set; } - // Tenant Management - public DbSet Tenants { get; set; } - public DbSet TenantConnectionStrings { get; set; } - - //Book Store - public DbSet Books { get; set; } - public DbSet Authors { get; set; } - - - #endregion - - public BookStoreDbContext(DbContextOptions options) - : base(options) - { - - } - - protected override void OnModelCreating(ModelBuilder builder) - { - base.OnModelCreating(builder); - - /* Include modules to your migration db context */ - - builder.ConfigurePermissionManagement(); - builder.ConfigureSettingManagement(); - builder.ConfigureBackgroundJobs(); - builder.ConfigureAuditLogging(); - builder.ConfigureIdentity(); - builder.ConfigureOpenIddict(); - builder.ConfigureFeatureManagement(); - builder.ConfigureTenantManagement(); - - /* Configure your own tables/entities inside here */ - - builder.Entity(b => - { - b.ToTable(BookStoreConsts.DbTablePrefix + "Books", - BookStoreConsts.DbSchema); - b.ConfigureByConvention(); //auto configure for the base class props - b.Property(x => x.Name).IsRequired().HasMaxLength(128); - - b.HasOne().WithMany().HasForeignKey(x => x.AuthorId).IsRequired(); - }); - - builder.Entity(b => - { - b.ToTable(BookStoreConsts.DbTablePrefix + "Authors", - BookStoreConsts.DbSchema); - - b.ConfigureByConvention(); - - b.Property(x => x.Name) - .IsRequired() - .HasMaxLength(AuthorConsts.MaxNameLength); - - b.HasIndex(x => x.Name); - }); - - } -} +using Acme.BookStore.Authors; +using Acme.BookStore.Books; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.BlobStoring.Database.EntityFrameworkCore; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Modeling; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Gdpr; +using Volo.Abp.Identity; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.LanguageManagement.EntityFrameworkCore; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TextTemplateManagement.EntityFrameworkCore; +using Volo.Saas.Editions; +using Volo.Saas.EntityFrameworkCore; +using Volo.Saas.Tenants; + +namespace Acme.BookStore.EntityFrameworkCore; + +[ReplaceDbContext(typeof(IIdentityProDbContext))] +[ReplaceDbContext(typeof(ISaasDbContext))] +[ConnectionStringName("Default")] +public class BookStoreDbContext : + AbpDbContext, + ISaasDbContext, + IIdentityProDbContext +{ + /* Add DbSet properties for your Aggregate Roots / Entities here. */ + + public DbSet Books { get; set; } + public DbSet Authors { get; set; } + + #region Entities from the modules + + /* Notice: We only implemented IIdentityProDbContext and ISaasDbContext + * and replaced them for this DbContext. This allows you to perform JOIN + * queries for the entities of these modules over the repositories easily. You + * typically don't need that for other modules. But, if you need, you can + * implement the DbContext interface of the needed module and use ReplaceDbContext + * attribute just like IIdentityProDbContext and ISaasDbContext. + * + * More info: Replacing a DbContext of a module ensures that the related module + * uses this DbContext on runtime. Otherwise, it will use its own DbContext class. + */ + + // Identity + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + public DbSet ClaimTypes { get; set; } + public DbSet OrganizationUnits { get; set; } + public DbSet SecurityLogs { get; set; } + public DbSet LinkUsers { get; set; } + public DbSet UserDelegations { get; set; } + public DbSet Sessions { get; set; } + + // SaaS + public DbSet Tenants { get; set; } + public DbSet Editions { get; set; } + public DbSet TenantConnectionStrings { get; set; } + + #endregion + + public BookStoreDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + builder.ConfigurePermissionManagement(); + builder.ConfigureSettingManagement(); + builder.ConfigureBackgroundJobs(); + builder.ConfigureAuditLogging(); + builder.ConfigureFeatureManagement(); + builder.ConfigureIdentityPro(); + builder.ConfigureOpenIddictPro(); + builder.ConfigureLanguageManagement(); + builder.ConfigureSaas(); + builder.ConfigureTextTemplateManagement(); + builder.ConfigureGdpr(); + builder.ConfigureBlobStoring(); + + /* Configure your own tables/entities inside here */ + + //builder.Entity(b => + //{ + // b.ToTable(BookStoreConsts.DbTablePrefix + "YourEntities", BookStoreConsts.DbSchema); + // b.ConfigureByConvention(); //auto configure for the base class props + // //... + //}); + + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", + BookStoreConsts.DbSchema); + b.ConfigureByConvention(); //auto configure for the base class props + b.Property(x => x.Name).IsRequired().HasMaxLength(128); + b.HasOne().WithMany().HasForeignKey(x => x.AuthorId).IsRequired(); + }); + + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Authors", + BookStoreConsts.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.Name) + .IsRequired() + .HasMaxLength(AuthorConsts.MaxNameLength); + + b.HasIndex(x => x.Name); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs index 7aedcfb017..b54837e169 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs @@ -1,33 +1,36 @@ -using System; -using System.IO; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Configuration; - -namespace Acme.BookStore.EntityFrameworkCore; - -/* This class is needed for EF Core console commands - * (like Add-Migration and Update-Database commands) */ -public class BookStoreDbContextFactory : IDesignTimeDbContextFactory -{ - public BookStoreDbContext CreateDbContext(string[] args) - { - BookStoreEfCoreEntityExtensionMappings.Configure(); - - var configuration = BuildConfiguration(); - - var builder = new DbContextOptionsBuilder() - .UseSqlServer(configuration.GetConnectionString("Default")); - - return new BookStoreDbContext(builder.Options); - } - - private static IConfigurationRoot BuildConfiguration() - { - var builder = new ConfigurationBuilder() - .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Acme.BookStore.DbMigrator/")) - .AddJsonFile("appsettings.json", optional: false); - - return builder.Build(); - } -} +using System; +using System.IO; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace Acme.BookStore.EntityFrameworkCore; + +/* This class is needed for EF Core console commands + * (like Add-Migration and Update-Database commands) */ +public class BookStoreDbContextFactory : IDesignTimeDbContextFactory +{ + public BookStoreDbContext CreateDbContext(string[] args) + { + // https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + + var configuration = BuildConfiguration(); + + BookStoreEfCoreEntityExtensionMappings.Configure(); + + var builder = new DbContextOptionsBuilder() + .UseNpgsql(configuration.GetConnectionString("Default")); + + return new BookStoreDbContext(builder.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Acme.BookStore.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false); + + return builder.Build(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEfCoreEntityExtensionMappings.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEfCoreEntityExtensionMappings.cs index 7e01f681e1..8b202764c7 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEfCoreEntityExtensionMappings.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEfCoreEntityExtensionMappings.cs @@ -1,44 +1,44 @@ -using Microsoft.EntityFrameworkCore; -using Volo.Abp.Identity; -using Volo.Abp.ObjectExtending; -using Volo.Abp.Threading; - -namespace Acme.BookStore.EntityFrameworkCore; - -public static class BookStoreEfCoreEntityExtensionMappings -{ - private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); - - public static void Configure() - { - BookStoreGlobalFeatureConfigurator.Configure(); - BookStoreModuleExtensionConfigurator.Configure(); - - OneTimeRunner.Run(() => - { - /* You can configure extra properties for the - * entities defined in the modules used by your application. - * - * This class can be used to map these extra properties to table fields in the database. - * - * USE THIS CLASS ONLY TO CONFIGURE EF CORE RELATED MAPPING. - * USE BookStoreModuleExtensionConfigurator CLASS (in the Domain.Shared project) - * FOR A HIGH LEVEL API TO DEFINE EXTRA PROPERTIES TO ENTITIES OF THE USED MODULES - * - * Example: Map a property to a table field: - - ObjectExtensionManager.Instance - .MapEfCoreProperty( - "MyProperty", - (entityBuilder, propertyBuilder) => - { - propertyBuilder.HasMaxLength(128); - } - ); - - * See the documentation for more: - * https://abp.io/docs/latest/Customizing-Application-Modules-Extending-Entities - */ - }); - } -} +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace Acme.BookStore.EntityFrameworkCore; + +public static class BookStoreEfCoreEntityExtensionMappings +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + BookStoreGlobalFeatureConfigurator.Configure(); + BookStoreModuleExtensionConfigurator.Configure(); + + OneTimeRunner.Run(() => + { + /* You can configure extra properties for the + * entities defined in the modules used by your application. + * + * This class can be used to map these extra properties to table fields in the database. + * + * USE THIS CLASS ONLY TO CONFIGURE EF CORE RELATED MAPPING. + * USE BookStoreModuleExtensionConfigurator CLASS (in the Domain.Shared project) + * FOR A HIGH LEVEL API TO DEFINE EXTRA PROPERTIES TO ENTITIES OF THE USED MODULES + * + * Example: Map a property to a table field: + + ObjectExtensionManager.Instance + .MapEfCoreProperty( + "MyProperty", + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(128); + } + ); + + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities + */ + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs index e9caedb233..72feb62748 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs @@ -1,54 +1,73 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Uow; -using Volo.Abp.AuditLogging.EntityFrameworkCore; -using Volo.Abp.BackgroundJobs.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore.SqlServer; -using Volo.Abp.FeatureManagement.EntityFrameworkCore; -using Volo.Abp.Identity.EntityFrameworkCore; -using Volo.Abp.Modularity; -using Volo.Abp.OpenIddict.EntityFrameworkCore; -using Volo.Abp.PermissionManagement.EntityFrameworkCore; -using Volo.Abp.SettingManagement.EntityFrameworkCore; -using Volo.Abp.TenantManagement.EntityFrameworkCore; - -namespace Acme.BookStore.EntityFrameworkCore; - -[DependsOn( - typeof(BookStoreDomainModule), - typeof(AbpIdentityEntityFrameworkCoreModule), - typeof(AbpOpenIddictEntityFrameworkCoreModule), - typeof(AbpPermissionManagementEntityFrameworkCoreModule), - typeof(AbpSettingManagementEntityFrameworkCoreModule), - typeof(AbpEntityFrameworkCoreSqlServerModule), - typeof(AbpBackgroundJobsEntityFrameworkCoreModule), - typeof(AbpAuditLoggingEntityFrameworkCoreModule), - typeof(AbpTenantManagementEntityFrameworkCoreModule), - typeof(AbpFeatureManagementEntityFrameworkCoreModule) - )] -public class BookStoreEntityFrameworkCoreModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - BookStoreEfCoreEntityExtensionMappings.Configure(); - } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddAbpDbContext(options => - { - /* Remove "includeAllEntities: true" to create - * default repositories only for aggregate roots */ - options.AddDefaultRepositories(includeAllEntities: true); - }); - - Configure(options => - { - /* The main point to change your DBMS. - * See also BookStoreMigrationsDbContextFactory for EF Core tooling. */ - options.UseSqlServer(); - }); - - } -} +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Uow; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.PostgreSql; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.BlobStoring.Database.EntityFrameworkCore; +using Volo.Abp.LanguageManagement.EntityFrameworkCore; +using Volo.Abp.TextTemplateManagement.EntityFrameworkCore; +using Volo.Saas.EntityFrameworkCore; +using Volo.Abp.Gdpr; +using Volo.Abp.Studio; + +namespace Acme.BookStore.EntityFrameworkCore; + +[DependsOn( + typeof(BookStoreDomainModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCorePostgreSqlModule), + typeof(AbpBackgroundJobsEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + typeof(AbpIdentityProEntityFrameworkCoreModule), + typeof(AbpOpenIddictProEntityFrameworkCoreModule), + typeof(LanguageManagementEntityFrameworkCoreModule), + typeof(SaasEntityFrameworkCoreModule), + typeof(TextTemplateManagementEntityFrameworkCoreModule), + typeof(AbpGdprEntityFrameworkCoreModule), + typeof(BlobStoringDatabaseEntityFrameworkCoreModule) + )] +public class BookStoreEntityFrameworkCoreModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + // https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + + BookStoreEfCoreEntityExtensionMappings.Configure(); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(options => + { + /* Remove "includeAllEntities: true" to create + * default repositories only for aggregate roots */ + options.AddDefaultRepositories(includeAllEntities: true); + }); + + if (AbpStudioAnalyzeHelper.IsInAnalyzeMode) + { + return; + } + + Configure(options => + { + /* The main point to change your DBMS. + * See also BookStoreDbContextFactory for EF Core tooling. */ + + options.UseNpgsql(); + + }); + + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs index dcdb2cd8a8..2bd5ca7b5c 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs @@ -1,34 +1,33 @@ -using System; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Acme.BookStore.Data; -using Volo.Abp.DependencyInjection; - -namespace Acme.BookStore.EntityFrameworkCore; - -public class EntityFrameworkCoreBookStoreDbSchemaMigrator - : IBookStoreDbSchemaMigrator, ITransientDependency -{ - private readonly IServiceProvider _serviceProvider; - - public EntityFrameworkCoreBookStoreDbSchemaMigrator( - IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public async Task MigrateAsync() - { - /* We intentionally resolving the BookStoreDbContext - * from IServiceProvider (instead of directly injecting it) - * to properly get the connection string of the current tenant in the - * current scope. - */ - - await _serviceProvider - .GetRequiredService() - .Database - .MigrateAsync(); - } -} +using System; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Acme.BookStore.Data; +using Volo.Abp.DependencyInjection; + +namespace Acme.BookStore.EntityFrameworkCore; + +public class EntityFrameworkCoreBookStoreDbSchemaMigrator + : IBookStoreDbSchemaMigrator, ITransientDependency +{ + private readonly IServiceProvider _serviceProvider; + + public EntityFrameworkCoreBookStoreDbSchemaMigrator(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task MigrateAsync() + { + /* We intentionally resolving the BookStoreDbContext + * from IServiceProvider (instead of directly injecting it) + * to properly get the connection string of the current tenant in the + * current scope. + */ + + await _serviceProvider + .GetRequiredService() + .Database + .MigrateAsync(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.cs deleted file mode 100644 index a8ea126d37..0000000000 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.cs +++ /dev/null @@ -1,1227 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Acme.BookStore.Migrations -{ - /// - public partial class Initial : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AbpAuditLogs", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - UserId = table.Column(type: "uniqueidentifier", nullable: true), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), - ImpersonatorUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), - ImpersonatorTenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ExecutionTime = table.Column(type: "datetime2", nullable: false), - ExecutionDuration = table.Column(type: "int", nullable: false), - ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), - Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Exceptions = table.Column(type: "nvarchar(max)", nullable: true), - Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - HttpStatusCode = table.Column(type: "int", nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpBackgroundJobs", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - JobName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - JobArgs = table.Column(type: "nvarchar(max)", maxLength: 1048576, nullable: false), - TryCount = table.Column(type: "smallint", nullable: false, defaultValue: (short)0), - CreationTime = table.Column(type: "datetime2", nullable: false), - NextTryTime = table.Column(type: "datetime2", nullable: false), - LastTryTime = table.Column(type: "datetime2", nullable: true), - IsAbandoned = table.Column(type: "bit", nullable: false, defaultValue: false), - Priority = table.Column(type: "tinyint", nullable: false, defaultValue: (byte)15), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpClaimTypes", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Required = table.Column(type: "bit", nullable: false), - IsStatic = table.Column(type: "bit", nullable: false), - Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ValueType = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatureGroups", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureGroups", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatures", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - DefaultValue = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - IsVisibleToClients = table.Column(type: "bit", nullable: false), - IsAvailableToHost = table.Column(type: "bit", nullable: false), - AllowedProviders = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ValueType = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatures", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatureValues", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpLinkUsers", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), - SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), - TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), - TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnits", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ParentId = table.Column(type: "uniqueidentifier", nullable: true), - Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), - DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - 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_AbpOrganizationUnits", x => x.Id); - table.ForeignKey( - name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", - column: x => x.ParentId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGrants", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGroups", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - IsEnabled = table.Column(type: "bit", nullable: false), - MultiTenancySide = table.Column(type: "tinyint", nullable: false), - Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpRoles", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - IsDefault = table.Column(type: "bit", nullable: false), - IsStatic = table.Column(type: "bit", nullable: false), - IsPublic = table.Column(type: "bit", nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSecurityLogs", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - UserId = table.Column(type: "uniqueidentifier", nullable: true), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSessions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - UserId = table.Column(type: "uniqueidentifier", nullable: false), - ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - IpAddresses = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - SignedIn = table.Column(type: "datetime2", nullable: false), - LastAccessed = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSessions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettingDefinitions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Description = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - DefaultValue = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), - IsVisibleToClients = table.Column(type: "bit", nullable: false), - Providers = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), - IsInherited = table.Column(type: "bit", nullable: false), - IsEncrypted = table.Column(type: "bit", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettingDefinitions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettings", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), - ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpTenants", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - NormalizedName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - 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_AbpTenants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUserDelegations", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), - TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), - StartTime = table.Column(type: "datetime2", nullable: false), - EndTime = table.Column(type: "datetime2", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUsers", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), - PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), - PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), - IsActive = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), - AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), - ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - LastPasswordChangeTime = table.Column(type: "datetimeoffset", 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_AbpUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AppAuthors", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - BirthDate = table.Column(type: "datetime2", nullable: false), - ShortBio = 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_AppAuthors", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictApplications", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - ClientId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), - ClientSecret = table.Column(type: "nvarchar(max)", nullable: true), - ClientType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - ConsentType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - DisplayName = table.Column(type: "nvarchar(max)", nullable: true), - DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), - JsonWebKeySet = table.Column(type: "nvarchar(max)", nullable: true), - Permissions = table.Column(type: "nvarchar(max)", nullable: true), - PostLogoutRedirectUris = table.Column(type: "nvarchar(max)", nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - RedirectUris = table.Column(type: "nvarchar(max)", nullable: true), - Requirements = table.Column(type: "nvarchar(max)", nullable: true), - Settings = table.Column(type: "nvarchar(max)", nullable: true), - ClientUri = table.Column(type: "nvarchar(max)", nullable: true), - LogoUri = 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_OpenIddictApplications", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictScopes", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Description = table.Column(type: "nvarchar(max)", nullable: true), - Descriptions = table.Column(type: "nvarchar(max)", nullable: true), - DisplayName = table.Column(type: "nvarchar(max)", nullable: true), - DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), - Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - Resources = 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_OpenIddictScopes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpAuditLogActions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), - ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), - ExecutionTime = table.Column(type: "datetime2", nullable: false), - ExecutionDuration = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); - table.ForeignKey( - name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityChanges", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ChangeTime = table.Column(type: "datetime2", nullable: false), - ChangeType = table.Column(type: "tinyint", nullable: false), - EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnitRoles", - columns: table => new - { - RoleId = table.Column(type: "uniqueidentifier", nullable: false), - OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpRoleClaims", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - RoleId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpRoleClaims_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpTenantConnectionStrings", - columns: table => new - { - TenantId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); - table.ForeignKey( - name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", - column: x => x.TenantId, - principalTable: "AbpTenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserClaims", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - UserId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpUserClaims_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserLogins", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); - table.ForeignKey( - name: "FK_AbpUserLogins_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserOrganizationUnits", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserRoles", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - RoleId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserTokens", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AbpUserTokens_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AppBooks", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - AuthorId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Type = table.Column(type: "int", nullable: false), - PublishDate = table.Column(type: "datetime2", nullable: false), - Price = table.Column(type: "real", nullable: false), - 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) - }, - constraints: table => - { - table.PrimaryKey("PK_AppBooks", x => x.Id); - table.ForeignKey( - name: "FK_AppBooks_AppAuthors_AuthorId", - column: x => x.AuthorId, - principalTable: "AppAuthors", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictAuthorizations", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), - CreationDate = table.Column(type: "datetime2", nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - Scopes = table.Column(type: "nvarchar(max)", nullable: true), - Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), - Type = table.Column(type: "nvarchar(50)", maxLength: 50, 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_OpenIddictAuthorizations", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityPropertyChanges", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), - NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", - column: x => x.EntityChangeId, - principalTable: "AbpEntityChanges", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictTokens", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), - AuthorizationId = table.Column(type: "uniqueidentifier", nullable: true), - CreationDate = table.Column(type: "datetime2", nullable: true), - ExpirationDate = table.Column(type: "datetime2", nullable: true), - Payload = table.Column(type: "nvarchar(max)", nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - RedemptionDate = table.Column(type: "datetime2", nullable: true), - ReferenceId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), - Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), - Type = table.Column(type: "nvarchar(50)", maxLength: 50, 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_OpenIddictTokens", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", - column: x => x.AuthorizationId, - principalTable: "OpenIddictAuthorizations", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_AuditLogId", - table: "AbpAuditLogActions", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", - table: "AbpAuditLogActions", - columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", - table: "AbpBackgroundJobs", - columns: new[] { "IsAbandoned", "NextTryTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_AuditLogId", - table: "AbpEntityChanges", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", - table: "AbpEntityChanges", - columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityPropertyChanges_EntityChangeId", - table: "AbpEntityPropertyChanges", - column: "EntityChangeId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureGroups_Name", - table: "AbpFeatureGroups", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatures_GroupName", - table: "AbpFeatures", - column: "GroupName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatures_Name", - table: "AbpFeatures", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", - table: "AbpFeatureValues", - columns: new[] { "Name", "ProviderName", "ProviderKey" }, - unique: true, - filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", - table: "AbpLinkUsers", - columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, - unique: true, - filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", - table: "AbpOrganizationUnitRoles", - columns: new[] { "RoleId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_Code", - table: "AbpOrganizationUnits", - column: "Code"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_ParentId", - table: "AbpOrganizationUnits", - column: "ParentId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", - table: "AbpPermissionGrants", - columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, - unique: true, - filter: "[TenantId] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGroups_Name", - table: "AbpPermissionGroups", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissions_GroupName", - table: "AbpPermissions", - column: "GroupName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissions_Name", - table: "AbpPermissions", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoleClaims_RoleId", - table: "AbpRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoles_NormalizedName", - table: "AbpRoles", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Action", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Action" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_ApplicationName", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "ApplicationName" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Identity", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Identity" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_UserId", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSessions_Device", - table: "AbpSessions", - column: "Device"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSessions_SessionId", - table: "AbpSessions", - column: "SessionId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSessions_TenantId_UserId", - table: "AbpSessions", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettingDefinitions_Name", - table: "AbpSettingDefinitions", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettings_Name_ProviderName_ProviderKey", - table: "AbpSettings", - columns: new[] { "Name", "ProviderName", "ProviderKey" }, - unique: true, - filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_Name", - table: "AbpTenants", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_NormalizedName", - table: "AbpTenants", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserClaims_UserId", - table: "AbpUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserLogins_LoginProvider_ProviderKey", - table: "AbpUserLogins", - columns: new[] { "LoginProvider", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", - table: "AbpUserOrganizationUnits", - columns: new[] { "UserId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserRoles_RoleId_UserId", - table: "AbpUserRoles", - columns: new[] { "RoleId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_Email", - table: "AbpUsers", - column: "Email"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedEmail", - table: "AbpUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedUserName", - table: "AbpUsers", - column: "NormalizedUserName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_UserName", - table: "AbpUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_AppAuthors_Name", - table: "AppAuthors", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AppBooks_AuthorId", - table: "AppBooks", - column: "AuthorId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictApplications_ClientId", - table: "OpenIddictApplications", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", - table: "OpenIddictAuthorizations", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictScopes_Name", - table: "OpenIddictScopes", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", - table: "OpenIddictTokens", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_AuthorizationId", - table: "OpenIddictTokens", - column: "AuthorizationId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ReferenceId", - table: "OpenIddictTokens", - column: "ReferenceId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AbpAuditLogActions"); - - migrationBuilder.DropTable( - name: "AbpBackgroundJobs"); - - migrationBuilder.DropTable( - name: "AbpClaimTypes"); - - migrationBuilder.DropTable( - name: "AbpEntityPropertyChanges"); - - migrationBuilder.DropTable( - name: "AbpFeatureGroups"); - - migrationBuilder.DropTable( - name: "AbpFeatures"); - - migrationBuilder.DropTable( - name: "AbpFeatureValues"); - - migrationBuilder.DropTable( - name: "AbpLinkUsers"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnitRoles"); - - migrationBuilder.DropTable( - name: "AbpPermissionGrants"); - - migrationBuilder.DropTable( - name: "AbpPermissionGroups"); - - migrationBuilder.DropTable( - name: "AbpPermissions"); - - migrationBuilder.DropTable( - name: "AbpRoleClaims"); - - migrationBuilder.DropTable( - name: "AbpSecurityLogs"); - - migrationBuilder.DropTable( - name: "AbpSessions"); - - migrationBuilder.DropTable( - name: "AbpSettingDefinitions"); - - migrationBuilder.DropTable( - name: "AbpSettings"); - - migrationBuilder.DropTable( - name: "AbpTenantConnectionStrings"); - - migrationBuilder.DropTable( - name: "AbpUserClaims"); - - migrationBuilder.DropTable( - name: "AbpUserDelegations"); - - migrationBuilder.DropTable( - name: "AbpUserLogins"); - - migrationBuilder.DropTable( - name: "AbpUserOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpUserRoles"); - - migrationBuilder.DropTable( - name: "AbpUserTokens"); - - migrationBuilder.DropTable( - name: "AppBooks"); - - migrationBuilder.DropTable( - name: "OpenIddictScopes"); - - migrationBuilder.DropTable( - name: "OpenIddictTokens"); - - migrationBuilder.DropTable( - name: "AbpEntityChanges"); - - migrationBuilder.DropTable( - name: "AbpTenants"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpRoles"); - - migrationBuilder.DropTable( - name: "AbpUsers"); - - migrationBuilder.DropTable( - name: "AppAuthors"); - - migrationBuilder.DropTable( - name: "OpenIddictAuthorizations"); - - migrationBuilder.DropTable( - name: "AbpAuditLogs"); - - migrationBuilder.DropTable( - name: "OpenIddictApplications"); - } - } -} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.Designer.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.Designer.cs similarity index 57% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.Designer.cs rename to BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.Designer.cs index 802845c670..be5af92260 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20240912065008_Initial.Designer.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.Designer.cs @@ -1,2141 +1,2606 @@ -// -using System; -using Acme.BookStore.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 Acme.BookStore.Migrations -{ - [DbContext(typeof(BookStoreDbContext))] - [Migration("20240912065008_Initial")] - partial class Initial - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("Acme.BookStore.Authors.Author", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("BirthDate") - .HasColumnType("datetime2"); - - 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("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ShortBio") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("AppAuthors", (string)null); - }); - - modelBuilder.Entity("Acme.BookStore.Books.Book", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("AuthorId") - .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("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - 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("Price") - .HasColumnType("real"); - - b.Property("PublishDate") - .HasColumnType("datetime2"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("AuthorId"); - - b.ToTable("AppBooks", (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("IpAddresses") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - 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("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("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("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("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("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - 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("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("ExpirationDate") - .HasColumnType("datetime2"); - - 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("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("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("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("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - 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("Acme.BookStore.Books.Book", b => - { - b.HasOne("Acme.BookStore.Authors.Author", null) - .WithMany() - .HasForeignKey("AuthorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - - b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) - .WithMany() - .HasForeignKey("AuthorizationId"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("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 - } - } -} +// +using System; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + [DbContext(typeof(BookStoreDbContext))] + [Migration("20251002112612_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("bytea"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Data"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Provider"); + + b.Property("RequestId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("GdprInfo", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("ReadyTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ReadyTime"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("GdprRequests", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("SignedIn") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationResourceRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BaseResources") + .HasMaxLength(1280) + .HasColumnType("character varying(1280)") + .HasColumnName("BaseResources"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("DefaultCulture") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("DefaultCulture"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("Name"); + + b.Property("SupportedCultures") + .HasMaxLength(640) + .HasColumnType("character varying(640)") + .HasColumnName("SupportedCultures"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpLocalizationResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationTextRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("ResourceName", "CultureName") + .IsUnique(); + + b.ToTable("AbpLocalizationTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("boolean") + .HasColumnName("IsEnabled"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("UiCultureName"); + + b.HasKey("Id"); + + b.HasIndex("CultureName"); + + b.ToTable("AbpLanguages", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("Name"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(65536) + .HasColumnType("character varying(65536)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ResourceName", "CultureName"); + + b.ToTable("AbpLanguageTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ClientSecret") + .HasColumnType("text"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientUri") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("text"); + + b.Property("Permissions") + .HasColumnType("text"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedirectUris") + .HasColumnType("text"); + + b.Property("Requirements") + .HasColumnType("text"); + + b.Property("Settings") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Descriptions") + .HasColumnType("text"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Resources") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AuthorizationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(65535) + .HasColumnType("character varying(65535)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpTextTemplateContents", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefinitionId") + .HasColumnType("uuid"); + + b.Property("FileContent") + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("DefinitionId"); + + b.ToTable("AbpTextTemplateDefinitionContentRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultCultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DisplayName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsInlineLocalized") + .HasColumnType("boolean"); + + b.Property("IsLayout") + .HasColumnType("boolean"); + + b.Property("Layout") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LocalizationResourceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RenderEngine") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTextTemplateDefinitionRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Editions.Edition", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PlanId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.ToTable("SaasEditions", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.Tenant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ActivationEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ActivationState") + .HasColumnType("smallint"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EditionEndDateUtc") + .HasColumnType("timestamp without time zone"); + + b.Property("EditionId") + .HasColumnType("uuid"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("NormalizedName"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("SaasTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("Value"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("SaasTenantConnectionStrings", (string)null); + }); + + 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.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.HasOne("Volo.Abp.Gdpr.GdprRequest", null) + .WithMany("Infos") + .HasForeignKey("RequestId") + .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.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.HasOne("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", null) + .WithMany() + .HasForeignKey("DefinitionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.HasOne("Volo.Saas.Tenants.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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.Gdpr.GdprRequest", b => + { + b.Navigation("Infos"); + }); + + 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.Saas.Tenants.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.cs new file mode 100644 index 0000000000..15cc049662 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002112612_Initial.cs @@ -0,0 +1,1505 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogExcelFiles", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + FileName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogExcelFiles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ApplicationName = table.Column(type: "character varying(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uuid", nullable: true), + UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uuid", nullable: true), + TenantName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ImpersonatorUserId = table.Column(type: "uuid", nullable: true), + ImpersonatorUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ImpersonatorTenantId = table.Column(type: "uuid", nullable: true), + ImpersonatorTenantName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ExecutionTime = table.Column(type: "timestamp without time zone", nullable: false), + ExecutionDuration = table.Column(type: "integer", nullable: false), + ClientIpAddress = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "character varying(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "character varying(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "text", nullable: true), + Comments = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "integer", nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpBackgroundJobs", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ApplicationName = table.Column(type: "character varying(96)", maxLength: 96, nullable: true), + JobName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + JobArgs = table.Column(type: "character varying(1048576)", maxLength: 1048576, nullable: false), + TryCount = table.Column(type: "smallint", nullable: false, defaultValue: (short)0), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + NextTryTime = table.Column(type: "timestamp without time zone", nullable: false), + LastTryTime = table.Column(type: "timestamp without time zone", nullable: true), + IsAbandoned = table.Column(type: "boolean", nullable: false, defaultValue: false), + Priority = table.Column(type: "smallint", nullable: false, defaultValue: (byte)15), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpBlobContainers", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBlobContainers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "boolean", nullable: false), + IsStatic = table.Column(type: "boolean", nullable: false), + Regex = table.Column(type: "character varying(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "integer", nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureGroups", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatures", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + GroupName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + DefaultValue = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + IsVisibleToClients = table.Column(type: "boolean", nullable: false), + IsAvailableToHost = table.Column(type: "boolean", nullable: false), + AllowedProviders = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatures", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "character varying(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLanguages", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + CultureName = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), + UiCultureName = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), + DisplayName = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), + IsEnabled = table.Column(type: "boolean", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLanguages", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLanguageTexts", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ResourceName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + CultureName = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), + Name = table.Column(type: "character varying(512)", maxLength: 512, nullable: false), + Value = table.Column(type: "character varying(65536)", maxLength: 65536, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLanguageTexts", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + SourceUserId = table.Column(type: "uuid", nullable: false), + SourceTenantId = table.Column(type: "uuid", nullable: true), + TargetUserId = table.Column(type: "uuid", nullable: false), + TargetTenantId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLocalizationResources", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + DefaultCulture = table.Column(type: "character varying(10)", maxLength: 10, nullable: true), + BaseResources = table.Column(type: "character varying(1280)", maxLength: 1280, nullable: true), + SupportedCultures = table.Column(type: "character varying(640)", maxLength: 640, nullable: true), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLocalizationResources", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLocalizationTexts", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ResourceName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + CultureName = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), + Value = table.Column(type: "character varying(1048576)", maxLength: 1048576, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLocalizationTexts", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ParentId = table.Column(type: "uuid", nullable: true), + Code = table.Column(type: "character varying(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + EntityVersion = table.Column(type: "integer", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + GroupName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "boolean", nullable: false), + MultiTenancySide = table.Column(type: "smallint", nullable: false), + Providers = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "boolean", nullable: false), + IsStatic = table.Column(type: "boolean", nullable: false), + IsPublic = table.Column(type: "boolean", nullable: false), + EntityVersion = table.Column(type: "integer", nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ApplicationName = table.Column(type: "character varying(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "character varying(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "character varying(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uuid", nullable: true), + UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "character varying(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSessions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + SessionId = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Device = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + DeviceInfo = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + TenantId = table.Column(type: "uuid", nullable: true), + UserId = table.Column(type: "uuid", nullable: false), + ClientId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + IpAddresses = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), + SignedIn = table.Column(type: "timestamp without time zone", nullable: false), + LastAccessed = table.Column(type: "timestamp without time zone", nullable: true), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSessions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettingDefinitions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "character varying(512)", maxLength: 512, nullable: true), + DefaultValue = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), + IsVisibleToClients = table.Column(type: "boolean", nullable: false), + Providers = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true), + IsInherited = table.Column(type: "boolean", nullable: false), + IsEncrypted = table.Column(type: "boolean", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettingDefinitions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "character varying(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTextTemplateContents", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + CultureName = table.Column(type: "character varying(10)", maxLength: 10, nullable: true), + Content = table.Column(type: "character varying(65535)", maxLength: 65535, nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTextTemplateContents", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTextTemplateDefinitionRecords", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + IsLayout = table.Column(type: "boolean", nullable: false), + Layout = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + LocalizationResourceName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + IsInlineLocalized = table.Column(type: "boolean", nullable: false), + DefaultCultureName = table.Column(type: "character varying(10)", maxLength: 10, nullable: true), + RenderEngine = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTextTemplateDefinitionRecords", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + SourceUserId = table.Column(type: "uuid", nullable: false), + TargetUserId = table.Column(type: "uuid", nullable: false), + StartTime = table.Column(type: "timestamp without time zone", nullable: false), + EndTime = table.Column(type: "timestamp without time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "boolean", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "boolean", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "character varying(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false, defaultValue: false), + IsActive = table.Column(type: "boolean", nullable: false), + TwoFactorEnabled = table.Column(type: "boolean", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), + LockoutEnabled = table.Column(type: "boolean", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "integer", nullable: false, defaultValue: 0), + ShouldChangePasswordOnNextLogin = table.Column(type: "boolean", nullable: false), + EntityVersion = table.Column(type: "integer", nullable: false), + LastPasswordChangeTime = table.Column(type: "timestamp with time zone", nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "GdprRequests", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + ReadyTime = table.Column(type: "timestamp without time zone", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_GdprRequests", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictApplications", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ApplicationType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + ClientId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + ClientSecret = table.Column(type: "text", nullable: true), + ClientType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + ConsentType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + DisplayName = table.Column(type: "text", nullable: true), + DisplayNames = table.Column(type: "text", nullable: true), + JsonWebKeySet = table.Column(type: "text", nullable: true), + Permissions = table.Column(type: "text", nullable: true), + PostLogoutRedirectUris = table.Column(type: "text", nullable: true), + Properties = table.Column(type: "text", nullable: true), + RedirectUris = table.Column(type: "text", nullable: true), + Requirements = table.Column(type: "text", nullable: true), + Settings = table.Column(type: "text", nullable: true), + ClientUri = table.Column(type: "text", nullable: true), + LogoUri = table.Column(type: "text", nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictScopes", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Description = table.Column(type: "text", nullable: true), + Descriptions = table.Column(type: "text", nullable: true), + DisplayName = table.Column(type: "text", nullable: true), + DisplayNames = table.Column(type: "text", nullable: true), + Name = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + Properties = table.Column(type: "text", nullable: true), + Resources = table.Column(type: "text", nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "SaasEditions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + DisplayName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + PlanId = table.Column(type: "uuid", nullable: true), + EntityVersion = table.Column(type: "integer", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_SaasEditions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "SaasTenants", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + NormalizedName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + EditionId = table.Column(type: "uuid", nullable: true), + EditionEndDateUtc = table.Column(type: "timestamp without time zone", nullable: true), + ActivationState = table.Column(type: "smallint", nullable: false), + ActivationEndDate = table.Column(type: "timestamp without time zone", nullable: true), + EntityVersion = table.Column(type: "integer", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_SaasTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + AuditLogId = table.Column(type: "uuid", nullable: false), + ServiceName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "timestamp without time zone", nullable: false), + ExecutionDuration = table.Column(type: "integer", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + AuditLogId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ChangeTime = table.Column(type: "timestamp without time zone", nullable: false), + ChangeType = table.Column(type: "smallint", nullable: false), + EntityTenantId = table.Column(type: "uuid", nullable: true), + EntityId = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + EntityTypeFullName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpBlobs", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ContainerId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + Content = table.Column(type: "bytea", maxLength: 2147483647, nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBlobs", x => x.Id); + table.ForeignKey( + name: "FK_AbpBlobs_AbpBlobContainers_ContainerId", + column: x => x.ContainerId, + principalTable: "AbpBlobContainers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uuid", nullable: false), + OrganizationUnitId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationU~", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + RoleId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ClaimType = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTextTemplateDefinitionContentRecords", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + DefinitionId = table.Column(type: "uuid", nullable: false), + FileName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + FileContent = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTextTemplateDefinitionContentRecords", x => x.Id); + table.ForeignKey( + name: "FK_AbpTextTemplateDefinitionContentRecords_AbpTextTemplateDefi~", + column: x => x.DefinitionId, + principalTable: "AbpTextTemplateDefinitionRecords", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ClaimType = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + LoginProvider = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + ProviderKey = table.Column(type: "character varying(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + OrganizationUnitId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationU~", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + RoleId = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + LoginProvider = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Value = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "GdprInfo", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + RequestId = table.Column(type: "uuid", nullable: false), + Data = table.Column(type: "text", nullable: false), + Provider = table.Column(type: "character varying(256)", maxLength: 256, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_GdprInfo", x => x.Id); + table.ForeignKey( + name: "FK_GdprInfo_GdprRequests_RequestId", + column: x => x.RequestId, + principalTable: "GdprRequests", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictAuthorizations", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ApplicationId = table.Column(type: "uuid", nullable: true), + CreationDate = table.Column(type: "timestamp without time zone", nullable: true), + Properties = table.Column(type: "text", nullable: true), + Scopes = table.Column(type: "text", nullable: true), + Status = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "character varying(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictAuthorizations_OpenIddictApplications_Application~", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "SaasTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SaasTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_SaasTenantConnectionStrings_SaasTenants_TenantId", + column: x => x.TenantId, + principalTable: "SaasTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + EntityChangeId = table.Column(type: "uuid", nullable: false), + NewValue = table.Column(type: "character varying(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "character varying(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictTokens", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ApplicationId = table.Column(type: "uuid", nullable: true), + AuthorizationId = table.Column(type: "uuid", nullable: true), + CreationDate = table.Column(type: "timestamp without time zone", nullable: true), + ExpirationDate = table.Column(type: "timestamp without time zone", nullable: true), + Payload = table.Column(type: "text", nullable: true), + Properties = table.Column(type: "text", nullable: true), + RedemptionDate = table.Column(type: "timestamp without time zone", nullable: true), + ReferenceId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Status = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "character varying(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", + column: x => x.AuthorizationId, + principalTable: "OpenIddictAuthorizations", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_Executio~", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", + table: "AbpBackgroundJobs", + columns: new[] { "IsAbandoned", "NextTryTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBlobContainers_TenantId_Name", + table: "AbpBlobContainers", + columns: new[] { "TenantId", "Name" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBlobs_ContainerId", + table: "AbpBlobs", + column: "ContainerId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpBlobs_TenantId_ContainerId_Name", + table: "AbpBlobs", + columns: new[] { "TenantId", "ContainerId", "Name" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureGroups_Name", + table: "AbpFeatureGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_GroupName", + table: "AbpFeatures", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_Name", + table: "AbpFeatures", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpLanguages_CultureName", + table: "AbpLanguages", + column: "CultureName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpLanguageTexts_TenantId_ResourceName_CultureName", + table: "AbpLanguageTexts", + columns: new[] { "TenantId", "ResourceName", "CultureName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_Targe~", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpLocalizationResources_Name", + table: "AbpLocalizationResources", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpLocalizationTexts_ResourceName_CultureName", + table: "AbpLocalizationTexts", + columns: new[] { "ResourceName", "CultureName" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_Device", + table: "AbpSessions", + column: "Device"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_SessionId", + table: "AbpSessions", + column: "SessionId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_TenantId_UserId", + table: "AbpSessions", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettingDefinitions_Name", + table: "AbpSettingDefinitions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpTextTemplateDefinitionContentRecords_DefinitionId", + table: "AbpTextTemplateDefinitionContentRecords", + column: "DefinitionId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpTextTemplateDefinitionRecords_Name", + table: "AbpTextTemplateDefinitionRecords", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_GdprInfo_RequestId", + table: "GdprInfo", + column: "RequestId"); + + migrationBuilder.CreateIndex( + name: "IX_GdprRequests_UserId", + table: "GdprRequests", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictApplications_ClientId", + table: "OpenIddictApplications", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", + table: "OpenIddictAuthorizations", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictScopes_Name", + table: "OpenIddictScopes", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", + table: "OpenIddictTokens", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_AuthorizationId", + table: "OpenIddictTokens", + column: "AuthorizationId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ReferenceId", + table: "OpenIddictTokens", + column: "ReferenceId"); + + migrationBuilder.CreateIndex( + name: "IX_SaasEditions_DisplayName", + table: "SaasEditions", + column: "DisplayName"); + + migrationBuilder.CreateIndex( + name: "IX_SaasTenants_Name", + table: "SaasTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_SaasTenants_NormalizedName", + table: "SaasTenants", + column: "NormalizedName"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpAuditLogExcelFiles"); + + migrationBuilder.DropTable( + name: "AbpBackgroundJobs"); + + migrationBuilder.DropTable( + name: "AbpBlobs"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureGroups"); + + migrationBuilder.DropTable( + name: "AbpFeatures"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLanguages"); + + migrationBuilder.DropTable( + name: "AbpLanguageTexts"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpLocalizationResources"); + + migrationBuilder.DropTable( + name: "AbpLocalizationTexts"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSessions"); + + migrationBuilder.DropTable( + name: "AbpSettingDefinitions"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTextTemplateContents"); + + migrationBuilder.DropTable( + name: "AbpTextTemplateDefinitionContentRecords"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "GdprInfo"); + + migrationBuilder.DropTable( + name: "OpenIddictScopes"); + + migrationBuilder.DropTable( + name: "OpenIddictTokens"); + + migrationBuilder.DropTable( + name: "SaasEditions"); + + migrationBuilder.DropTable( + name: "SaasTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpBlobContainers"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTextTemplateDefinitionRecords"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "GdprRequests"); + + migrationBuilder.DropTable( + name: "OpenIddictAuthorizations"); + + migrationBuilder.DropTable( + name: "SaasTenants"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + + migrationBuilder.DropTable( + name: "OpenIddictApplications"); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.Designer.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.Designer.cs new file mode 100644 index 0000000000..d95729f999 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.Designer.cs @@ -0,0 +1,2658 @@ +// +using System; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + [DbContext(typeof(BookStoreDbContext))] + [Migration("20251002120859_Created_Book_Entity")] + partial class Created_Book_Entity + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Acme.BookStore.Books.Book", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("real"); + + b.Property("PublishDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AppBooks", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("bytea"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Data"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Provider"); + + b.Property("RequestId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("GdprInfo", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("ReadyTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ReadyTime"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("GdprRequests", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("SignedIn") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationResourceRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BaseResources") + .HasMaxLength(1280) + .HasColumnType("character varying(1280)") + .HasColumnName("BaseResources"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("DefaultCulture") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("DefaultCulture"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("Name"); + + b.Property("SupportedCultures") + .HasMaxLength(640) + .HasColumnType("character varying(640)") + .HasColumnName("SupportedCultures"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpLocalizationResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationTextRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("ResourceName", "CultureName") + .IsUnique(); + + b.ToTable("AbpLocalizationTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("boolean") + .HasColumnName("IsEnabled"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("UiCultureName"); + + b.HasKey("Id"); + + b.HasIndex("CultureName"); + + b.ToTable("AbpLanguages", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("Name"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(65536) + .HasColumnType("character varying(65536)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ResourceName", "CultureName"); + + b.ToTable("AbpLanguageTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ClientSecret") + .HasColumnType("text"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientUri") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("text"); + + b.Property("Permissions") + .HasColumnType("text"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedirectUris") + .HasColumnType("text"); + + b.Property("Requirements") + .HasColumnType("text"); + + b.Property("Settings") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Descriptions") + .HasColumnType("text"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Resources") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AuthorizationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(65535) + .HasColumnType("character varying(65535)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpTextTemplateContents", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefinitionId") + .HasColumnType("uuid"); + + b.Property("FileContent") + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("DefinitionId"); + + b.ToTable("AbpTextTemplateDefinitionContentRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultCultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DisplayName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsInlineLocalized") + .HasColumnType("boolean"); + + b.Property("IsLayout") + .HasColumnType("boolean"); + + b.Property("Layout") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LocalizationResourceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RenderEngine") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTextTemplateDefinitionRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Editions.Edition", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PlanId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.ToTable("SaasEditions", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.Tenant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ActivationEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ActivationState") + .HasColumnType("smallint"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EditionEndDateUtc") + .HasColumnType("timestamp without time zone"); + + b.Property("EditionId") + .HasColumnType("uuid"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("NormalizedName"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("SaasTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("Value"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("SaasTenantConnectionStrings", (string)null); + }); + + 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.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.HasOne("Volo.Abp.Gdpr.GdprRequest", null) + .WithMany("Infos") + .HasForeignKey("RequestId") + .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.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.HasOne("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", null) + .WithMany() + .HasForeignKey("DefinitionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.HasOne("Volo.Saas.Tenants.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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.Gdpr.GdprRequest", b => + { + b.Navigation("Infos"); + }); + + 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.Saas.Tenants.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.cs new file mode 100644 index 0000000000..c2dfddb1c0 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002120859_Created_Book_Entity.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + /// + public partial class Created_Book_Entity : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AppBooks", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Type = table.Column(type: "integer", nullable: false), + PublishDate = table.Column(type: "timestamp without time zone", nullable: false), + Price = table.Column(type: "real", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AppBooks", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AppBooks"); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.Designer.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.Designer.cs new file mode 100644 index 0000000000..d746674f2e --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.Designer.cs @@ -0,0 +1,2724 @@ +// +using System; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + [DbContext(typeof(BookStoreDbContext))] + [Migration("20251002131459_Added_Authors")] + partial class Added_Authors + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Acme.BookStore.Authors.Author", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("BirthDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ShortBio") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AppAuthors", (string)null); + }); + + modelBuilder.Entity("Acme.BookStore.Books.Book", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("real"); + + b.Property("PublishDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AppBooks", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("bytea"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Data"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Provider"); + + b.Property("RequestId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("GdprInfo", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("ReadyTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ReadyTime"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("GdprRequests", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("SignedIn") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationResourceRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BaseResources") + .HasMaxLength(1280) + .HasColumnType("character varying(1280)") + .HasColumnName("BaseResources"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("DefaultCulture") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("DefaultCulture"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("Name"); + + b.Property("SupportedCultures") + .HasMaxLength(640) + .HasColumnType("character varying(640)") + .HasColumnName("SupportedCultures"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpLocalizationResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationTextRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("ResourceName", "CultureName") + .IsUnique(); + + b.ToTable("AbpLocalizationTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("boolean") + .HasColumnName("IsEnabled"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("UiCultureName"); + + b.HasKey("Id"); + + b.HasIndex("CultureName"); + + b.ToTable("AbpLanguages", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("Name"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(65536) + .HasColumnType("character varying(65536)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ResourceName", "CultureName"); + + b.ToTable("AbpLanguageTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ClientSecret") + .HasColumnType("text"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientUri") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("text"); + + b.Property("Permissions") + .HasColumnType("text"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedirectUris") + .HasColumnType("text"); + + b.Property("Requirements") + .HasColumnType("text"); + + b.Property("Settings") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Descriptions") + .HasColumnType("text"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Resources") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AuthorizationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(65535) + .HasColumnType("character varying(65535)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpTextTemplateContents", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefinitionId") + .HasColumnType("uuid"); + + b.Property("FileContent") + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("DefinitionId"); + + b.ToTable("AbpTextTemplateDefinitionContentRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultCultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DisplayName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsInlineLocalized") + .HasColumnType("boolean"); + + b.Property("IsLayout") + .HasColumnType("boolean"); + + b.Property("Layout") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LocalizationResourceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RenderEngine") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTextTemplateDefinitionRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Editions.Edition", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PlanId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.ToTable("SaasEditions", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.Tenant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ActivationEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ActivationState") + .HasColumnType("smallint"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EditionEndDateUtc") + .HasColumnType("timestamp without time zone"); + + b.Property("EditionId") + .HasColumnType("uuid"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("NormalizedName"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("SaasTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("Value"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("SaasTenantConnectionStrings", (string)null); + }); + + 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.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.HasOne("Volo.Abp.Gdpr.GdprRequest", null) + .WithMany("Infos") + .HasForeignKey("RequestId") + .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.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.HasOne("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", null) + .WithMany() + .HasForeignKey("DefinitionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.HasOne("Volo.Saas.Tenants.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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.Gdpr.GdprRequest", b => + { + b.Navigation("Infos"); + }); + + 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.Saas.Tenants.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.cs new file mode 100644 index 0000000000..833ade53a7 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002131459_Added_Authors.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + /// + public partial class Added_Authors : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AppAuthors", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + BirthDate = table.Column(type: "timestamp without time zone", nullable: false), + ShortBio = table.Column(type: "text", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uuid", nullable: true), + DeletionTime = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AppAuthors", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_AppAuthors_Name", + table: "AppAuthors", + column: "Name"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AppAuthors"); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.Designer.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.Designer.cs new file mode 100644 index 0000000000..d341dc3eff --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.Designer.cs @@ -0,0 +1,2738 @@ +// +using System; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + [DbContext(typeof(BookStoreDbContext))] + [Migration("20251002135800_Added_AuthorId_To_Book")] + partial class Added_AuthorId_To_Book + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Acme.BookStore.Authors.Author", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("BirthDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ShortBio") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AppAuthors", (string)null); + }); + + modelBuilder.Entity("Acme.BookStore.Books.Book", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("real"); + + b.Property("PublishDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.ToTable("AppBooks", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("bytea"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Data"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Provider"); + + b.Property("RequestId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("GdprInfo", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("ReadyTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ReadyTime"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("GdprRequests", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("SignedIn") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationResourceRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BaseResources") + .HasMaxLength(1280) + .HasColumnType("character varying(1280)") + .HasColumnName("BaseResources"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("DefaultCulture") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("DefaultCulture"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("Name"); + + b.Property("SupportedCultures") + .HasMaxLength(640) + .HasColumnType("character varying(640)") + .HasColumnName("SupportedCultures"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpLocalizationResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationTextRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("ResourceName", "CultureName") + .IsUnique(); + + b.ToTable("AbpLocalizationTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("boolean") + .HasColumnName("IsEnabled"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("UiCultureName"); + + b.HasKey("Id"); + + b.HasIndex("CultureName"); + + b.ToTable("AbpLanguages", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("Name"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(65536) + .HasColumnType("character varying(65536)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ResourceName", "CultureName"); + + b.ToTable("AbpLanguageTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ClientSecret") + .HasColumnType("text"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientUri") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("text"); + + b.Property("Permissions") + .HasColumnType("text"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedirectUris") + .HasColumnType("text"); + + b.Property("Requirements") + .HasColumnType("text"); + + b.Property("Settings") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Descriptions") + .HasColumnType("text"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Resources") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AuthorizationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(65535) + .HasColumnType("character varying(65535)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpTextTemplateContents", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefinitionId") + .HasColumnType("uuid"); + + b.Property("FileContent") + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("DefinitionId"); + + b.ToTable("AbpTextTemplateDefinitionContentRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultCultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DisplayName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsInlineLocalized") + .HasColumnType("boolean"); + + b.Property("IsLayout") + .HasColumnType("boolean"); + + b.Property("Layout") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LocalizationResourceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RenderEngine") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTextTemplateDefinitionRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Editions.Edition", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PlanId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.ToTable("SaasEditions", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.Tenant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ActivationEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ActivationState") + .HasColumnType("smallint"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EditionEndDateUtc") + .HasColumnType("timestamp without time zone"); + + b.Property("EditionId") + .HasColumnType("uuid"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("NormalizedName"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("SaasTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("Value"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("SaasTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Acme.BookStore.Books.Book", b => + { + b.HasOne("Acme.BookStore.Authors.Author", null) + .WithMany() + .HasForeignKey("AuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.HasOne("Volo.Abp.Gdpr.GdprRequest", null) + .WithMany("Infos") + .HasForeignKey("RequestId") + .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.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.HasOne("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", null) + .WithMany() + .HasForeignKey("DefinitionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.HasOne("Volo.Saas.Tenants.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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.Gdpr.GdprRequest", b => + { + b.Navigation("Infos"); + }); + + 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.Saas.Tenants.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.cs new file mode 100644 index 0000000000..7a5df191c5 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20251002135800_Added_AuthorId_To_Book.cs @@ -0,0 +1,51 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + /// + public partial class Added_AuthorId_To_Book : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AuthorId", + table: "AppBooks", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); + + migrationBuilder.CreateIndex( + name: "IX_AppBooks_AuthorId", + table: "AppBooks", + column: "AuthorId"); + + migrationBuilder.AddForeignKey( + name: "FK_AppBooks_AppAuthors_AuthorId", + table: "AppBooks", + column: "AuthorId", + principalTable: "AppAuthors", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_AppBooks_AppAuthors_AuthorId", + table: "AppBooks"); + + migrationBuilder.DropIndex( + name: "IX_AppBooks_AuthorId", + table: "AppBooks"); + + migrationBuilder.DropColumn( + name: "AuthorId", + table: "AppBooks"); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs index e551d87897..4f9eddde16 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs @@ -1,2138 +1,2735 @@ -// -using System; -using Acme.BookStore.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.Abp.EntityFrameworkCore; - -#nullable disable - -namespace Acme.BookStore.Migrations -{ - [DbContext(typeof(BookStoreDbContext))] - partial class BookStoreDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("Acme.BookStore.Authors.Author", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("BirthDate") - .HasColumnType("datetime2"); - - 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("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ShortBio") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("AppAuthors", (string)null); - }); - - modelBuilder.Entity("Acme.BookStore.Books.Book", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("AuthorId") - .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("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - 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("Price") - .HasColumnType("real"); - - b.Property("PublishDate") - .HasColumnType("datetime2"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("AuthorId"); - - b.ToTable("AppBooks", (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("IpAddresses") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - 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("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("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("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("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("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - 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("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("ExpirationDate") - .HasColumnType("datetime2"); - - 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("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("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("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("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - 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("Acme.BookStore.Books.Book", b => - { - b.HasOne("Acme.BookStore.Authors.Author", null) - .WithMany() - .HasForeignKey("AuthorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - - b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) - .WithMany() - .HasForeignKey("AuthorizationId"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("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 - } - } -} +// +using System; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Acme.BookStore.Migrations +{ + [DbContext(typeof(BookStoreDbContext))] + partial class BookStoreDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Acme.BookStore.Authors.Author", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("BirthDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ShortBio") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AppAuthors", (string)null); + }); + + modelBuilder.Entity("Acme.BookStore.Books.Book", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("real"); + + b.Property("PublishDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.ToTable("AppBooks", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("bytea"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Data"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Provider"); + + b.Property("RequestId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("GdprInfo", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("ReadyTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ReadyTime"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("GdprRequests", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("SignedIn") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationResourceRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BaseResources") + .HasMaxLength(1280) + .HasColumnType("character varying(1280)") + .HasColumnName("BaseResources"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("DefaultCulture") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("DefaultCulture"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("Name"); + + b.Property("SupportedCultures") + .HasMaxLength(640) + .HasColumnType("character varying(640)") + .HasColumnName("SupportedCultures"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpLocalizationResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.External.LocalizationTextRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("ResourceName", "CultureName") + .IsUnique(); + + b.ToTable("AbpLocalizationTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("boolean") + .HasColumnName("IsEnabled"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("UiCultureName"); + + b.HasKey("Id"); + + b.HasIndex("CultureName"); + + b.ToTable("AbpLanguages", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.LanguageManagement.LanguageText", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("CultureName"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("Name"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ResourceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(65536) + .HasColumnType("character varying(65536)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ResourceName", "CultureName"); + + b.ToTable("AbpLanguageTexts", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ClientSecret") + .HasColumnType("text"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ClientUri") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("text"); + + b.Property("Permissions") + .HasColumnType("text"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedirectUris") + .HasColumnType("text"); + + b.Property("Requirements") + .HasColumnType("text"); + + b.Property("Settings") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Descriptions") + .HasColumnType("text"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("DisplayNames") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Resources") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AuthorizationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(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("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(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("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(65535) + .HasColumnType("character varying(65535)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpTextTemplateContents", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefinitionId") + .HasColumnType("uuid"); + + b.Property("FileContent") + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("DefinitionId"); + + b.ToTable("AbpTextTemplateDefinitionContentRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultCultureName") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("DisplayName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsInlineLocalized") + .HasColumnType("boolean"); + + b.Property("IsLayout") + .HasColumnType("boolean"); + + b.Property("Layout") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LocalizationResourceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RenderEngine") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTextTemplateDefinitionRecords", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Editions.Edition", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PlanId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.ToTable("SaasEditions", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.Tenant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ActivationEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ActivationState") + .HasColumnType("smallint"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EditionEndDateUtc") + .HasColumnType("timestamp without time zone"); + + b.Property("EditionId") + .HasColumnType("uuid"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("NormalizedName"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("SaasTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("Value"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("SaasTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Acme.BookStore.Books.Book", b => + { + b.HasOne("Acme.BookStore.Authors.Author", null) + .WithMany() + .HasForeignKey("AuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Gdpr.GdprInfo", b => + { + b.HasOne("Volo.Abp.Gdpr.GdprRequest", null) + .WithMany("Infos") + .HasForeignKey("RequestId") + .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.TextTemplateManagement.TextTemplates.TextTemplateDefinitionContentRecord", b => + { + b.HasOne("Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateDefinitionRecord", null) + .WithMany() + .HasForeignKey("DefinitionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Saas.Tenants.TenantConnectionString", b => + { + b.HasOne("Volo.Saas.Tenants.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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.Gdpr.GdprRequest", b => + { + b.Navigation("Infos"); + }); + + 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.Saas.Tenants.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Properties/AssemblyInfo.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Properties/AssemblyInfo.cs index 9f5a215cba..bfd49e057f 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Properties/AssemblyInfo.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.EntityFrameworkCore/Properties/AssemblyInfo.cs @@ -1,2 +1,2 @@ -using System.Runtime.CompilerServices; -[assembly:InternalsVisibleToAttribute("Acme.BookStore.EntityFrameworkCore.Tests")] +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("Acme.BookStore.EntityFrameworkCore.Tests")] diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg new file mode 100644 index 0000000000..0796bdaa4d --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api-client" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg.analyze.json new file mode 100644 index 0000000000..7bfb447eb4 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.abppkg.analyze.json @@ -0,0 +1,118 @@ +{ + "name": "Acme.BookStore.HttpApi.Client", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Acme.BookStore.Application.Contracts", + "namespace": "Acme.BookStore", + "name": "BookStoreApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.HttpApi.Client", + "namespace": "Volo.Abp.PermissionManagement", + "name": "AbpPermissionManagementHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.HttpApi.Client", + "namespace": "Volo.Abp.FeatureManagement", + "name": "AbpFeatureManagementHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.HttpApi.Client", + "namespace": "Volo.Abp.Identity", + "name": "AbpIdentityHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Admin.HttpApi.Client", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountAdminHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Public.HttpApi.Client", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountPublicHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.HttpApi.Client", + "namespace": "Volo.Abp.AuditLogging", + "name": "AbpAuditLoggingHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.HttpApi.Client", + "namespace": "Volo.Abp.OpenIddict", + "name": "AbpOpenIddictProHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.HttpApi.Client", + "namespace": "Volo.Abp.TextTemplateManagement", + "name": "TextTemplateManagementHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.HttpApi.Client", + "namespace": "Volo.Abp.LanguageManagement", + "name": "LanguageManagementHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.HttpApi.Client", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprHttpApiClientModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.HttpApi.Client", + "namespace": "Volo.Abp.SettingManagement", + "name": "AbpSettingManagementHttpApiClientModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreHttpApiClientModule", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj index 1180feb616..4591ca8196 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj @@ -1,28 +1,38 @@ - - - - - - netstandard2.0 - Acme.BookStore - - - - - - - - - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs index 642b895278..bc977fd256 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs @@ -1,38 +1,49 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Account; -using Volo.Abp.FeatureManagement; -using Volo.Abp.Identity; -using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement; -using Volo.Abp.TenantManagement; -using Volo.Abp.SettingManagement; -using Volo.Abp.VirtualFileSystem; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreApplicationContractsModule), - typeof(AbpAccountHttpApiClientModule), - typeof(AbpIdentityHttpApiClientModule), - typeof(AbpPermissionManagementHttpApiClientModule), - typeof(AbpTenantManagementHttpApiClientModule), - typeof(AbpFeatureManagementHttpApiClientModule), - typeof(AbpSettingManagementHttpApiClientModule) -)] -public class BookStoreHttpApiClientModule : AbpModule -{ - public const string RemoteServiceName = "Default"; - - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddHttpClientProxies( - typeof(BookStoreApplicationContractsModule).Assembly, - RemoteServiceName - ); - - Configure(options => - { - options.FileSets.AddEmbedded(); - }); - } -} +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Account; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.VirtualFileSystem; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.AuditLogging; +using Volo.Abp.LanguageManagement; +using Volo.Abp.TextTemplateManagement; +using Volo.Saas.Host; +using Volo.Abp.Gdpr; +using Volo.Abp.OpenIddict; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreApplicationContractsModule), + typeof(AbpPermissionManagementHttpApiClientModule), + typeof(AbpFeatureManagementHttpApiClientModule), + typeof(AbpIdentityHttpApiClientModule), + typeof(AbpAccountAdminHttpApiClientModule), + typeof(AbpAccountPublicHttpApiClientModule), + typeof(SaasHostHttpApiClientModule), + typeof(AbpAuditLoggingHttpApiClientModule), + typeof(AbpOpenIddictProHttpApiClientModule), + typeof(TextTemplateManagementHttpApiClientModule), + typeof(LanguageManagementHttpApiClientModule), + typeof(AbpGdprHttpApiClientModule), + typeof(AbpSettingManagementHttpApiClientModule) +)] +public class BookStoreHttpApiClientModule : AbpModule +{ + public const string RemoteServiceName = "Default"; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpClientProxies( + typeof(BookStoreApplicationContractsModule).Assembly, + RemoteServiceName + ); + + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.abppkg new file mode 100644 index 0000000000..55bebebd50 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.abppkg @@ -0,0 +1,4 @@ +{ + "role": "host.http-api", + "projectId": "4de5316e-f146-4098-b5ed-c0d6397d36b9" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj new file mode 100644 index 0000000000..6094f0e57f --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj @@ -0,0 +1,67 @@ + + + + + + net9.0 + enable + InProcess + Acme.BookStore + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreBrandingProvider.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreBrandingProvider.cs new file mode 100644 index 0000000000..6afef2d0a6 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreBrandingProvider.cs @@ -0,0 +1,19 @@ +using Microsoft.Extensions.Localization; +using Acme.BookStore.Localization; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Ui.Branding; + +namespace Acme.BookStore; + +[Dependency(ReplaceServices = true)] +public class BookStoreBrandingProvider : DefaultBrandingProvider +{ + private IStringLocalizer _localizer; + + public BookStoreBrandingProvider(IStringLocalizer localizer) + { + _localizer = localizer; + } + + public override string AppName => _localizer["AppName"]; +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs new file mode 100644 index 0000000000..b9b96e0fd6 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs @@ -0,0 +1,355 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Google; +using Microsoft.AspNetCore.Authentication.MicrosoftAccount; +using Microsoft.AspNetCore.Authentication.Twitter; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Extensions.DependencyInjection; +using OpenIddict.Validation.AspNetCore; +using OpenIddict.Server.AspNetCore; +using Acme.BookStore.EntityFrameworkCore; +using Acme.BookStore.MultiTenancy; +using Acme.BookStore.HealthChecks; +using Microsoft.OpenApi.Models; +using Volo.Abp; +using Volo.Abp.Studio; +using Volo.Abp.Account; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Autofac; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.UI.Navigation.Urls; +using Volo.Abp.VirtualFileSystem; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling; +using Volo.Abp.LeptonX.Shared; +using Microsoft.AspNetCore.Hosting; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Identity; +using Volo.Abp.OpenIddict; +using Volo.Abp.Swashbuckle; +using Volo.Abp.Studio.Client.AspNetCore; +using Volo.Abp.Security.Claims; +using Volo.Abp.Account.Public.Web.ExternalProviders; +using Volo.Abp.Account.Public.Web; +using Volo.Abp.Account.Public.Web.Impersonation; +using Volo.Saas.Host; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreHttpApiModule), + typeof(AbpStudioClientAspNetCoreModule), + typeof(AbpAspNetCoreMvcUiLeptonXThemeModule), + typeof(AbpAutofacModule), + typeof(AbpAspNetCoreMultiTenancyModule), + typeof(BookStoreApplicationModule), + typeof(BookStoreEntityFrameworkCoreModule), + typeof(AbpAccountPublicWebImpersonationModule), + typeof(AbpAccountPublicWebOpenIddictModule), + typeof(AbpSwashbuckleModule), + typeof(AbpAspNetCoreSerilogModule) + )] +public class BookStoreHttpApiHostModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("BookStore"); + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + + if (!hostingEnvironment.IsDevelopment()) + { + PreConfigure(options => + { + options.AddDevelopmentEncryptionAndSigningCertificate = false; + }); + + PreConfigure(serverBuilder => + { + serverBuilder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx", configuration["AuthServer:CertificatePassPhrase"]!); + serverBuilder.SetIssuer(new Uri(configuration["AuthServer:Authority"]!)); + }); + } + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + if (!configuration.GetValue("App:DisablePII")) + { + Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true; + Microsoft.IdentityModel.Logging.IdentityModelEventSource.LogCompleteSecurityArtifact = true; + } + + if (!configuration.GetValue("AuthServer:RequireHttpsMetadata")) + { + Configure(options => + { + options.DisableTransportSecurityRequirement = true; + }); + + Configure(options => + { + options.ForwardedHeaders = ForwardedHeaders.XForwardedProto; + }); + } + + ConfigureAuthentication(context); + ConfigureUrls(configuration); + ConfigureBundles(); + ConfigureConventionalControllers(); + ConfigureExternalProviders(context); + ConfigureImpersonation(context, configuration); + ConfigureHealthChecks(context); + ConfigureSwagger(context, configuration); + ConfigureVirtualFileSystem(context); + ConfigureCors(context, configuration); + ConfigureTheme(); + } + + private void ConfigureTheme() + { + Configure(options => + { + options.DefaultStyle = LeptonXStyleNames.System; + }); + } + + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + context.Services.Configure(options => + { + options.IsDynamicClaimsEnabled = true; + }); + } + + private void ConfigureUrls(IConfiguration configuration) + { + Configure(options => + { + options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); + }); + } + + private void ConfigureBundles() + { + Configure(options => + { + options.StyleBundles.Configure( + LeptonXThemeBundles.Styles.Global, + bundle => + { + bundle.AddFiles("/global-styles.css"); + } + ); + + options.ScriptBundles.Configure( + LeptonXThemeBundles.Scripts.Global, + bundle => + { + bundle.AddFiles("/global-scripts.js"); + } + ); + }); + } + + + private void ConfigureVirtualFileSystem(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + if (hostingEnvironment.IsDevelopment()) + { + Configure(options => + { + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Domain.Shared")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Domain")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Application.Contracts")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Acme.BookStore.Application")); + }); + } + } + + private void ConfigureConventionalControllers() + { + Configure(options => + { + options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly); + }); + } + + private static void ConfigureSwagger(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddAbpSwaggerGenWithOidc( + configuration["AuthServer:Authority"]!, + ["BookStore"], + [AbpSwaggerOidcFlows.AuthorizationCode], + null, + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookStore API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + }); + } + + private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddCors(options => + { + options.AddDefaultPolicy(builder => + { + builder + .WithOrigins( + configuration["App:CorsOrigins"]? + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.Trim().RemovePostFix("/")) + .ToArray() ?? Array.Empty() + ) + .WithAbpExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + private void ConfigureExternalProviders(ServiceConfigurationContext context) + { + context.Services.AddAuthentication() + .AddGoogle(GoogleDefaults.AuthenticationScheme, options => + { + options.ClaimActions.MapJsonKey(AbpClaimTypes.Picture, "picture"); + }) + .WithDynamicOptions( + GoogleDefaults.AuthenticationScheme, + options => + { + options.WithProperty(x => x.ClientId); + options.WithProperty(x => x.ClientSecret, isSecret: true); + } + ) + .AddMicrosoftAccount(MicrosoftAccountDefaults.AuthenticationScheme, options => + { + //Personal Microsoft accounts as an example. + options.AuthorizationEndpoint = "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize"; + options.TokenEndpoint = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"; + + options.ClaimActions.MapCustomJson("picture", _ => "https://graph.microsoft.com/v1.0/me/photo/$value"); + options.SaveTokens = true; + }) + .WithDynamicOptions( + MicrosoftAccountDefaults.AuthenticationScheme, + options => + { + options.WithProperty(x => x.ClientId); + options.WithProperty(x => x.ClientSecret, isSecret: true); + } + ) + .AddTwitter(TwitterDefaults.AuthenticationScheme, options => + { + options.ClaimActions.MapJsonKey(AbpClaimTypes.Picture, "profile_image_url_https"); + options.RetrieveUserDetails = true; + }) + .WithDynamicOptions( + TwitterDefaults.AuthenticationScheme, + options => + { + options.WithProperty(x => x.ConsumerKey); + options.WithProperty(x => x.ConsumerSecret, isSecret: true); + } + ); + } + + private void ConfigureImpersonation(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.Configure(options => + { + options.TenantAdminUserName = "admin"; + options.ImpersonationTenantPermission = SaasHostPermissions.Tenants.Impersonation; + options.ImpersonationUserPermission = IdentityPermissions.Users.Impersonation; + }); + } + + private void ConfigureHealthChecks(ServiceConfigurationContext context) + { + context.Services.AddBookStoreHealthChecks(); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + app.UseForwardedHeaders(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAbpRequestLocalization(); + + if (!env.IsDevelopment()) + { + app.UseErrorPage(); + } + + app.UseRouting(); + app.MapAbpStaticAssets(); + app.UseAbpStudioLink(); + app.UseAbpSecurityHeaders(); + app.UseCors(); + app.UseAuthentication(); + app.UseAbpOpenIddictValidation(); + + if (MultiTenancyConsts.IsEnabled) + { + app.UseMultiTenancy(); + } + + app.UseUnitOfWork(); + app.UseDynamicClaims(); + app.UseAuthorization(); + + app.UseSwagger(); + app.UseAbpSwaggerUI(options => + { + options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookStore API"); + + var configuration = context.ServiceProvider.GetRequiredService(); + options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); + }); + app.UseAuditing(); + app.UseAbpSerilogEnrichers(); + app.UseConfiguredEndpoints(); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile new file mode 100644 index 0000000000..74201f5c92 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile @@ -0,0 +1,5 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 +COPY bin/Release/net9.0/publish/ app/ +WORKDIR /app +ENV ASPNETCORE_URLS=http://+:80 +ENTRYPOINT ["dotnet", "Acme.BookStore.HttpApi.Host.dll"] \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile.local b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile.local new file mode 100644 index 0000000000..de04180d2d --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Dockerfile.local @@ -0,0 +1,18 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +USER $APP_UID +EXPOSE 8080 +EXPOSE 8081 + +COPY bin/Release/net9.0/publish/ app/ +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +WORKDIR /src +RUN dotnet dev-certs https -v -ep openiddict.pfx -p 2fbe0669-7a6d-4e08-9f1f-d4d906b6a6c3 +RUN chmod 644 openiddict.pfx + +FROM base AS final +WORKDIR /app +COPY --from=build /src . + +ENTRYPOINT ["dotnet", "Acme.BookStore.HttpApi.Host.dll"] \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/BookStoreDatabaseCheck.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/BookStoreDatabaseCheck.cs new file mode 100644 index 0000000000..673730517a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/BookStoreDatabaseCheck.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; + +namespace Acme.BookStore.HealthChecks; + +public class BookStoreDatabaseCheck : IHealthCheck, ITransientDependency +{ + protected readonly IIdentityRoleRepository IdentityRoleRepository; + + public BookStoreDatabaseCheck(IIdentityRoleRepository identityRoleRepository) + { + IdentityRoleRepository = identityRoleRepository; + } + + public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + try + { + await IdentityRoleRepository.GetListAsync(sorting: nameof(IdentityRole.Id), maxResultCount: 1, cancellationToken: cancellationToken); + + return HealthCheckResult.Healthy($"Could connect to database and get record."); + } + catch (Exception e) + { + return HealthCheckResult.Unhealthy($"Error when trying to get database record. ", e); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/HealthChecksBuilderExtensions.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/HealthChecksBuilderExtensions.cs new file mode 100644 index 0000000000..b346f8cee1 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/HealthChecks/HealthChecksBuilderExtensions.cs @@ -0,0 +1,76 @@ +using System; +using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; + +namespace Acme.BookStore.HealthChecks; + +public static class HealthChecksBuilderExtensions +{ + public static void AddBookStoreHealthChecks(this IServiceCollection services) + { + // Add your health checks here + var healthChecksBuilder = services.AddHealthChecks(); + healthChecksBuilder.AddCheck("BookStore DbContext Check", tags: new string[] { "database" }); + + services.ConfigureHealthCheckEndpoint("/health-status"); + + var configuration = services.GetConfiguration(); + var healthCheckUrl = configuration["App:HealthCheckUrl"]; + + if (string.IsNullOrEmpty(healthCheckUrl)) + { + healthCheckUrl = "/health-status"; + } + + var healthChecksUiBuilder = services.AddHealthChecksUI(settings => + { + settings.AddHealthCheckEndpoint("BookStore Health Status", configuration["App:HealthUiCheckUrl"] ?? healthCheckUrl); + }); + + // Set your HealthCheck UI Storage here + healthChecksUiBuilder.AddInMemoryStorage(); + + services.MapHealthChecksUiEndpoints(options => + { + options.UIPath = "/health-ui"; + options.ApiPath = "/health-api"; + }); + } + + private static IServiceCollection ConfigureHealthCheckEndpoint(this IServiceCollection services, string path) + { + services.Configure(options => + { + options.EndpointConfigureActions.Add(endpointContext => + { + endpointContext.Endpoints.MapHealthChecks( + new PathString(path.EnsureStartsWith('/')), + new HealthCheckOptions + { + Predicate = _ => true, + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse, + AllowCachingResponses = false, + }); + }); + }); + + return services; + } + + private static IServiceCollection MapHealthChecksUiEndpoints(this IServiceCollection services, Action? setupOption = null) + { + services.Configure(routerOptions => + { + routerOptions.EndpointConfigureActions.Add(endpointContext => + { + endpointContext.Endpoints.MapHealthChecksUI(setupOption); + }); + }); + + return services; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml new file mode 100644 index 0000000000..de48b6634a --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml @@ -0,0 +1,127 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Microsoft.AspNetCore.Http.Extensions +@using Acme.BookStore.Localization +@using Acme.BookStore.Pages +@using Volo.Abp.Account.Localization +@using Volo.Abp.Users +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@using Volo.Abp.Ui.Branding +@model IndexModel +@inject IHtmlLocalizer L +@inject IHtmlLocalizer AccountLocalizer +@inject ICurrentUser CurrentUser +@inject IBrandingProvider BrandingProvider +@inject ITheme Theme +@{ + Layout = Theme.GetEmptyLayout(); +} + +

+
+ + + + + +
+
diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml.cs new file mode 100644 index 0000000000..13a1257edf --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/Index.cshtml.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Localization; +using Volo.Abp.OpenIddict.Applications; + +namespace Acme.BookStore.Pages; + +public class IndexModel : AbpPageModel +{ + public List? Applications { get; protected set; } + + public IReadOnlyList? Languages { get; protected set; } + + public string? CurrentLanguage { get; protected set; } + + protected IOpenIddictApplicationRepository OpenIdApplicationRepository { get; } + + protected ILanguageProvider LanguageProvider { get; } + + public IndexModel(IOpenIddictApplicationRepository openIdApplicationmRepository, ILanguageProvider languageProvider) + { + OpenIdApplicationRepository = openIdApplicationmRepository; + LanguageProvider = languageProvider; + } + + public async Task OnGetAsync() + { + Applications = await OpenIdApplicationRepository.GetListAsync(); + + Languages = await LanguageProvider.GetLanguagesAsync(); + CurrentLanguage = CultureInfo.CurrentCulture.DisplayName; + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_ViewImports.cshtml b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/_ViewImports.cshtml similarity index 98% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_ViewImports.cshtml rename to BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/_ViewImports.cshtml index c1da1f5f10..6d6bdbde94 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/Pages/_ViewImports.cshtml +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Pages/_ViewImports.cshtml @@ -1,4 +1,4 @@ -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI -@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Program.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Program.cs new file mode 100644 index 0000000000..af45628320 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Program.cs @@ -0,0 +1,63 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Serilog; +using Serilog.Events; + +namespace Acme.BookStore; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateBootstrapLogger(); + + try + { + Log.Information("Starting Acme.BookStore.HttpApi.Host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host + .AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog((context, services, loggerConfiguration) => + { + loggerConfiguration + #if DEBUG + .MinimumLevel.Debug() + #else + .MinimumLevel.Information() + #endif + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.AbpStudio(services)); + }); + await builder.AddApplicationAsync(); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); + return 0; + } + catch (Exception ex) + { + if (ex is HostAbortedException) + { + throw; + } + + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Properties/launchSettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Properties/launchSettings.json new file mode 100644 index 0000000000..e865a79af9 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44330", + "sslPort": 44330 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Acme.BookStore.HttpApi.Host": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:44330", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/abp.resourcemapping.js b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/abp.resourcemapping.js similarity index 89% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/abp.resourcemapping.js rename to BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/abp.resourcemapping.js index 4a2ad45896..c415151020 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/abp.resourcemapping.js +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/abp.resourcemapping.js @@ -1,11 +1,11 @@ -module.exports = { - aliases: { - - }, - clean: [ - - ], - mappings: { - - } -}; +module.exports = { + aliases: { + + }, + clean: [ + + ], + mappings: { + + } +}; diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.Development.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.Development.json similarity index 66% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.Development.json rename to BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.Development.json index 2c63c08510..f3ee419dbc 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/appsettings.Development.json +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.Development.json @@ -1,2 +1,2 @@ -{ -} +{ +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.json new file mode 100644 index 0000000000..45ada1a12c --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.json @@ -0,0 +1,26 @@ +{ + "App": { + "SelfUrl": "https://localhost:44330", + "CorsOrigins": "https://*.BookStore.com,https://localhost:44352", + "RedirectAllowedUrls": "https://localhost:44352", + "DisablePII": false, + "HealthCheckUrl": "/health-status" + }, + "ConnectionStrings": { + "Default": "Host=localhost;Port=5432;Database=BookStore;User ID=root;Password=root;" + }, + "AuthServer": { + "Authority": "https://localhost:44330", + "RequireHttpsMetadata": true, + "SwaggerClientId": "BookStore_Swagger", + "CertificatePassPhrase": "2fbe0669-7a6d-4e08-9f1f-d4d906b6a6c3" + }, + "StringEncryption": { + "DefaultPassPhrase": "0uFikygpIPCtQ5XU" + }, + "Abp": { + "Telemetry": { + "IsEnabled": true + } + } +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.secrets.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.secrets.json new file mode 100644 index 0000000000..2273f5bbfe --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/appsettings.secrets.json @@ -0,0 +1,3 @@ +{ +"AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgA2ADQAYQA1AGEAZQBmADUALQBhADcAMQA5AC0AYwAxADYAMAAtADYAYQAwAGEALQAzADkAZQBmADEANgAzADYAZgAxAGEAZAA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4ANgA0AGEANQBhAGUAZgA1AC0AYQA3ADEAOQAtAGMAMQA2ADAALQA2AGEAMABhAC0AMwA5AGUAZgAxADYAMwA2AGYAMQBhAGQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBWAG8AbABvAHMAbwBmAHQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBDAHIAZQBhAHQAaQBvAG4AVABpAG0AZQAiAD4AMgAwADIANQAtADEAMAAtADAAMgAgADEAMAA6ADUAMgA6ADAANQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAA8AC8ATABpAGMAZQBuAHMAZQBBAHQAdAByAGkAYgB1AHQAZQBzAD4ACgAgACAAPABTAGkAZwBuAGEAdAB1AHIAZQA+AE0ARQBRAEMASQBFAFAAaABzAFMAdgBoAHQAWABTAHQAcgB6AHEARwA1AEcAMAAzAGkAdwBTAFYARQBzAGoANABPAGYAUwAwAEgAYgBtAC8AOABxAGMATgA4AGcAOQB4AEEAaQBBAFoATgBXAHkARABvADMARgBlADgARgB5AFEAZwA5AFYAWgBsAEcAdAB1ADYAcgAvAEgATQA0AFcAUAA5ADQAQgBKAEgATgB1ADAAZQBHAGIANgBoAFEAPQA9ADwALwBTAGkAZwBuAGEAdAB1AHIAZQA+AAoAPAAvAEwAaQBjAGUAbgBzAGUAPgBNAEYAawB3AEUAdwBZAEgASwBvAFoASQB6AGoAMABDAEEAUQBZAEkASwBvAFoASQB6AGoAMABEAEEAUQBjAEQAUQBnAEEARQA2ACsANgBUAEgAVAByAGkANQBuAHgAaQA0ACsAMAByADMARABQAEYAOABTAG4AdABGAHkAeQBhAFUAMgBXAFEALwAyAG4AUABjADIAZABEAGoAWQBUAFAAcgBSAGMASQBlADAAbwB0AC8AVABEAHcAeABjAEwATgBmADQAUgBmAFcAWgAzAEIAZgBUAGQAVwBvAE8AOQBQAEUAQgAzAHoASwBLAHYAYgAzAHcAPQA9AF8AMQAyADQA" +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/package.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/package.json new file mode 100644 index 0000000000..435493fe4e --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/package.json @@ -0,0 +1,9 @@ +{ + "version": "1.0.0", + "name": "my-app", + "private": true, + "dependencies": { + "@volo/account": "~9.3.4", + "@volo/abp.aspnetcore.mvc.ui.theme.leptonx": "~4.3.4" + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/web.config b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/web.config similarity index 82% rename from BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/web.config rename to BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/web.config index a7385ad5f5..8b5a325f5f 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.Blazor/web.config +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/web.config @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-scripts.js b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-scripts.js new file mode 100644 index 0000000000..0960af64f0 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-scripts.js @@ -0,0 +1 @@ +/* Your Global Scripts */ diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-styles.css b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-styles.css new file mode 100644 index 0000000000..b3f117a5a8 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/global-styles.css @@ -0,0 +1,10 @@ +:root { + --lpx-theme-light-bg: url('/LeptonX/images/login-pages/login-bg-img-light.svg'); + --lpx-theme-dim-bg: url('/LeptonX/images/login-pages/login-bg-img-dim.svg'); + --lpx-theme-dark-bg: url('/LeptonX/images/login-pages/login-bg-img-dark.svg'); +} + +:root { + --lpx-logo: url('/images/logo/leptonx/icon.svg'); + --lpx-logo-icon: url('/images/logo/leptonx/icon.svg'); +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/angular.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/angular.svg new file mode 100644 index 0000000000..468c4baed9 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/aspnetcore.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/aspnetcore.svg new file mode 100644 index 0000000000..82a2ef892f --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/aspnetcore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/blazor.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/blazor.svg new file mode 100644 index 0000000000..2f5a30cfe0 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/blazor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/swagger.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/swagger.svg new file mode 100644 index 0000000000..f45cd91e98 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/clients/swagger.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/icon.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/icon.svg new file mode 100644 index 0000000000..57c7d0dec5 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark.svg new file mode 100644 index 0000000000..1e77f6b8ed --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-light.svg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-light.svg new file mode 100644 index 0000000000..0d896a5ce0 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/wwwroot/images/logo/leptonx/logo-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/yarn.lock b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/yarn.lock new file mode 100644 index 0000000000..ce1022d3cf --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi.Host/yarn.lock @@ -0,0 +1,1043 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.3.5.tgz#dd72c09b56153ff14e4cb97d49ea55cdc4d7115d" + integrity sha512-A/HcSeZXyIYFm5SwoBlrd7pGtVlh5/CUM25yYv7C/521/zdTjUw4aQzrZjjeE2iOyvhqgBbuh11UlwUYMH4hUA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.3.5" + "@abp/bootstrap" "~9.3.5" + "@abp/bootstrap-datepicker" "~9.3.5" + "@abp/bootstrap-daterangepicker" "~9.3.5" + "@abp/datatables.net-bs5" "~9.3.5" + "@abp/font-awesome" "~9.3.5" + "@abp/jquery-form" "~9.3.5" + "@abp/jquery-validation-unobtrusive" "~9.3.5" + "@abp/lodash" "~9.3.5" + "@abp/luxon" "~9.3.5" + "@abp/malihu-custom-scrollbar-plugin" "~9.3.5" + "@abp/moment" "~9.3.5" + "@abp/select2" "~9.3.5" + "@abp/sweetalert2" "~9.3.5" + "@abp/timeago" "~9.3.5" + +"@abp/aspnetcore.mvc.ui@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.3.5.tgz#73e58ca29fcfbcf310bea680f8ead7bff93eec91" + integrity sha512-uHLr9B0Uvi0YBhBjFPKnRnH3OU7tGddblnorDnM9bqycwevXu0fspR0nR/66DAe67IvdvctVfk0yVzY8MUJAFw== + dependencies: + ansi-colors "^4.1.3" + +"@abp/bootstrap-datepicker@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.3.5.tgz#fddbb233e138701202b71bc191fedbda7ba39fcd" + integrity sha512-xIDEPfg8hvHjx9UwJPcKZB3B6Pp964fdxmb7w9D2zps+0lnV/i5KI5tZPNN7lX8L97z1ClZtPY2nBSZ88z60/w== + dependencies: + bootstrap-datepicker "^1.10.0" + +"@abp/bootstrap-daterangepicker@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.3.5.tgz#2f4466f03a0b9f40fb305e0ed3e6487f1c2bb5ad" + integrity sha512-bZEmn5fUpuKsFh9/96rMwL+041CHrmRGyOL6f/2877d0G9MrATV0upc8qmMOPc21npIy+ugB8+OYMbz1ZFSjpw== + dependencies: + bootstrap-daterangepicker "^3.1.0" + +"@abp/bootstrap@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.3.5.tgz#5e89f6222edac9b506dd53745cfb84c2710b2ddf" + integrity sha512-d7XSzqlVqSoRnj/5Y3PrqGjqwGLkreqxI50GuInLJI21WMkas7U2ZYgpgcG+tSaXXseBCFK5IjIOsAfb5/8fFQ== + dependencies: + "@abp/core" "~9.3.5" + bootstrap "^5.3.3" + +"@abp/core@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.3.5.tgz#6fa71209977b3f84f3afb263c991bc2abc2d10f7" + integrity sha512-oZreHthqaauKABCE5wTUAiczVbyrRTjYA3FSnsgvQF3nFiiK7yeBuam9oHp5TrJAaSeAfGEl6t9Y/rkEtQBGhw== + dependencies: + "@abp/utils" "~9.3.5" + +"@abp/cropperjs@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/cropperjs/-/cropperjs-9.3.5.tgz#7b0f0e1955a78825dae83786c376cb0998c20653" + integrity sha512-BwLdK6XemBmiAM3w4HjmYnGAWZ9TqQQavHU6vBZABNMGV/2WwoWWNzQMLCEsZNXRGVg9LQBeqmQyVrqhEiu5Cw== + dependencies: + "@abp/core" "~9.3.5" + cropperjs "^1.6.2" + +"@abp/datatables.net-bs5@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.3.5.tgz#4246c0f3a76749fcfae53902626a81f4c28b1f23" + integrity sha512-qXXniOr8inQpe7J0u2xPfKfxPR3aBLLwiyAgiqnowyZzNCnLxNhxAQaRbvRQhaLKiS9D7LS76c6v4ftaaJtDww== + dependencies: + "@abp/datatables.net" "~9.3.5" + datatables.net-bs5 "^2.1.8" + +"@abp/datatables.net@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.3.5.tgz#e8288069dee086eae426d67ef3a63ecef6d4342f" + integrity sha512-dTAEY0xkGF6PLGUBeu9cgDqRvrip1pNU6kp8KtwBbKzeK848N4s299aZNt8EvQK2bsGm0JWt/qjz/P09uRNUUQ== + dependencies: + "@abp/jquery" "~9.3.5" + datatables.net "^2.1.8" + +"@abp/font-awesome@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.3.5.tgz#f11084601ac556f43d0d0affcd6911911ccd26c4" + integrity sha512-uQdPnPSKjh0s6Jt6CH5XoaxnE47s6dbiAieSLMNZxxyMzHPA+xLRfoFTgPpFUt71pKvjGMR8ajaCd+on2iVhdw== + dependencies: + "@abp/core" "~9.3.5" + "@fortawesome/fontawesome-free" "^6.6.0" + +"@abp/jquery-form@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.3.5.tgz#9e6b4d9fbc73c49254fe4c2d2dc1a28ed540c8ad" + integrity sha512-EEaTH2tDwK96VW/CHOIVwjKvaAGRA95hNIe9BAE4tgZEPqsXdPi7lJpG7OAcAirIqeKvEeigJiOaDo69t3pqkQ== + dependencies: + "@abp/jquery" "~9.3.5" + jquery-form "^4.3.0" + +"@abp/jquery-validation-unobtrusive@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.3.5.tgz#7dcaf225bbfc4db7b2540adef518f5fcf173226c" + integrity sha512-LZROgSxJfBzBzsoY9N1DjYpHtT3OXOaYcZL6FNxmhVfhBVycAkVK3qv8nSWKEnfUlVcvDiKfQHa6ye9o10xwGw== + dependencies: + "@abp/jquery-validation" "~9.3.5" + jquery-validation-unobtrusive "^4.0.0" + +"@abp/jquery-validation@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.3.5.tgz#3ef7fc930aef0768baaf14558f12539964a8f185" + integrity sha512-n+ZV3IH/lOZU8U673AQT38UnN0D+b8eOAPXWUjU069/6y5icxXT2fwQhq5CF6nCTZehlvNKvlkU2RV2xpGldkA== + dependencies: + "@abp/jquery" "~9.3.5" + jquery-validation "^1.21.0" + +"@abp/jquery@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.3.5.tgz#23ec07889e0b43467920bf00b453e2d6706271cd" + integrity sha512-MxEzXHQWam6Ue1D3SN05+bYkt+WkP1XcVy/L10hl/jMJhPzFl4Aa806nLo0peO/vkJISLaVgdRImOSB4sB+5qw== + dependencies: + "@abp/core" "~9.3.5" + jquery "~3.7.1" + +"@abp/lodash@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.3.5.tgz#15baef672b667106ef3c84bfc9d6e6f274abec66" + integrity sha512-k9UqlVkjI2ANhR2HtqgRHAg33xWuYC8yug6zwVlenFEcr4XKFdI43O1xJOxvopmJ8SGHDTWo3le0xaLB9WTd0Q== + dependencies: + "@abp/core" "~9.3.5" + lodash "^4.17.21" + +"@abp/luxon@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.3.5.tgz#2704e01283343c839b04701a6492f196cccb2128" + integrity sha512-hyx0O058+uQYMZD/S7zb4qiO9I1kBWNGRwfdAjoPylqmr6fSoGni6HOITUJtis9ZB7hjHsY78/PGsfZnOpQRZw== + dependencies: + "@abp/core" "~9.3.5" + luxon "^3.5.0" + +"@abp/malihu-custom-scrollbar-plugin@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.3.5.tgz#06d06434965199e5a7fee8184b5a2a53181c0a3e" + integrity sha512-a/TAWunnswiLcCn0h4qEtanVht5A4AsY7Glk6AcfWXfUPHMzpxu8nuEf/YRrMmO+4dcX7xfOYAtap517ESR+zA== + dependencies: + "@abp/core" "~9.3.5" + malihu-custom-scrollbar-plugin "^3.1.5" + +"@abp/moment@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.3.5.tgz#cd5589448b46c0e74f375e8e2d321854f5380d07" + integrity sha512-Eg7pOGVpxgIBSKeP+dd8r+kdCQuFasfHEVpPU7aJaO1TRpIHjZqMeuUAUDWcqFS07tc+QcS2Iw16y1fxShIp2A== + dependencies: + moment "^2.30.1" + +"@abp/qrcode@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/qrcode/-/qrcode-9.3.5.tgz#cf93026adfcdba3bf0484d57e500167caa4b8217" + integrity sha512-bNC7RadjJSAD5UdsdNQSDH8OdgVIJGdC920tK/V2Jlvdt7SDtUqSr7370vqtv6vwmCJgGGd1p3TVelBr7ieT2g== + dependencies: + "@abp/core" "~9.3.5" + +"@abp/select2@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.3.5.tgz#1ceb98c8791a0d608cd33141e665347de3c0aaf1" + integrity sha512-kv2vskVP6z0ip+JRtqmRpDHQUshY7W/xgVjriXaI7lrf9fvguWa9mxOlUBGYzEOmUe6YOev4D+WINLrMpA4JbA== + dependencies: + "@abp/core" "~9.3.5" + select2 "^4.0.13" + +"@abp/sweetalert2@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.3.5.tgz#dd325274f94f02b45775f97410c43dd0ee781bbc" + integrity sha512-Cxsv1vwAvzjqtTlhkAW4uIzQTpDH+GjYgR8ADZST4tklllhh+noPmCH96bVPf0FHnCX2a8/bPMdG5cykTaOiug== + dependencies: + "@abp/core" "~9.3.5" + sweetalert2 "^11.14.1" + +"@abp/timeago@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.3.5.tgz#65436cc7afb572dfbec5c3599746d7c2a87658fd" + integrity sha512-QBoXJB1tBThrqydgswTL8ZJu0HGhnmyBb0wISzdGY5fGKDC4ZYNiEA1j8CEWpACjsxFnfhrtT9GlvA3kHfQdYw== + dependencies: + "@abp/jquery" "~9.3.5" + timeago "^1.6.7" + +"@abp/uppy@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.3.5.tgz#3392b08fe1f1dd84bd85216686ecca1af71ed795" + integrity sha512-SktBB72MQKQoy4G31glvhqlwFoLJQquVbHTsEgGw4U2dla+I0lGPhKDfs+3XY6PuoK1j0udlB6VjOGpGhTTJhg== + dependencies: + "@abp/core" "~9.3.5" + uppy "^4.4.1" + +"@abp/utils@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.3.5.tgz#f63233e37196c3158d9ae2ebe7644168645bca84" + integrity sha512-8t/qFalw6/iGWos0r9NcqtoRyBOjpaPP09lHX3LDnpLd8C1Ax/xmNNsrYr+cDOy6cDr++JkZJQZSz+tKwv9okA== + dependencies: + just-compare "^2.3.0" + +"@abp/zxcvbn@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@abp/zxcvbn/-/zxcvbn-9.3.5.tgz#7a0c0b75f340d3b41ba6944e57456ba660490c0c" + integrity sha512-W7+i5UrhK5x+poK5dpzkTxifTedqdl6Ljeoz9P+gy6geHT5ahZXoCjWmy8mx/gMq6FSvHrLNh7+HJkOIy0z5nw== + dependencies: + "@abp/core" "~9.3.5" + zxcvbn "^4.4.2" + +"@fortawesome/fontawesome-free@^6.6.0": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz#8249de9b7e22fcb3ceb5e66090c30a1d5492b81a" + integrity sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA== + +"@transloadit/prettier-bytes@^0.3.4": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz#0cca83975293e3f4990229914942c69714122ede" + integrity sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA== + +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + +"@uppy/audio@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@uppy/audio/-/audio-2.2.2.tgz#a62e28becc70782a309b61b1338041820b3d707c" + integrity sha512-63pwCo+JbJyxB1V/YK59cMSMFi8+g9Mfew6awfJFeu4tAK0HHfZtUk5+fUdZJRdCf4eIwBAiwixBL8Q4BOes+Q== + dependencies: + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/aws-s3@4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/aws-s3/-/aws-s3-4.3.2.tgz#e1b8514a4b9269b21cd7711d243d38946f2b977b" + integrity sha512-w3LrMUEI9pXVcn5LZ5oNL92hyocMu8mxfDSVVQIAQKxR+TPi57FfusDBqBB5T33UvxJH8EUGt9a04tuU/LpKqw== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/utils" "^6.2.2" + +"@uppy/box@3.3.2", "@uppy/box@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@uppy/box/-/box-3.3.2.tgz#a7a79e61fdce905ce9c1175b1856047c0ddea1ee" + integrity sha512-4hRXPWy48Gpgyegd7lBPMYQTplfFEq1uaHe9ZltHu53LBeXasuGeZuprMbhIQ/7Sl/7UQwiAU0te9uv/ypoXGg== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/companion-client@4.5.2", "@uppy/companion-client@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@uppy/companion-client/-/companion-client-4.5.2.tgz#f29d00e426a7eb500070d699d4ced67d169504e7" + integrity sha512-hfUsReHM5COhn+5d7CdZgZaG8BtDvtwj7vjXzg8qmgKI901mYUm/Zh420iOKT7eHiofKVTNoa7oijeGrqUEnyg== + dependencies: + "@uppy/utils" "^6.2.2" + namespace-emitter "^2.0.1" + p-retry "^6.1.0" + +"@uppy/compressor@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@uppy/compressor/-/compressor-2.3.2.tgz#32f052e00d139ba67278f36e614d8602e2630d46" + integrity sha512-gIWZWo+2GeMzkuEr20Cp3Q7BKwTmqrYaF6ooEpBkeeHEt7J+ikx2VwnUJrQkSWFJYw6jc1qTcHD8eK2JEcbHhA== + dependencies: + "@transloadit/prettier-bytes" "^0.3.4" + "@uppy/utils" "^6.2.2" + compressorjs "^1.2.1" + preact "^10.5.13" + promise-queue "^2.2.5" + +"@uppy/core@4.5.3": + version "4.5.3" + resolved "https://registry.yarnpkg.com/@uppy/core/-/core-4.5.3.tgz#31789fdbbf28183235d9749d1bd09af1c2c7aa09" + integrity sha512-52VLeBUY/j904h48lpPGykuWikkOOS4Lz/qkmalDiBQfNALb6iB1MOZs079IM3o/uMLYxzZRL80C3sKpkBUYcw== + dependencies: + "@transloadit/prettier-bytes" "^0.3.4" + "@uppy/store-default" "^4.3.2" + "@uppy/utils" "^6.2.2" + lodash "^4.17.21" + mime-match "^1.0.2" + namespace-emitter "^2.0.1" + nanoid "^5.0.9" + preact "^10.5.13" + +"@uppy/dashboard@4.4.3", "@uppy/dashboard@^4.4.2": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@uppy/dashboard/-/dashboard-4.4.3.tgz#0271ab514c9cc1d3b9a0ffbb80de086741e7fac9" + integrity sha512-IwgDDTbk9p4OoAJvvvx6sQSemKTIJq9IDSryNVgbbC6NiR9HSyRcu0+WdOZLiR9DOhDg2oYcoNgv7DMlrktI6g== + dependencies: + "@transloadit/prettier-bytes" "^0.3.4" + "@uppy/informer" "^4.3.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/status-bar" "^4.2.3" + "@uppy/thumbnail-generator" "^4.2.2" + "@uppy/utils" "^6.2.2" + classnames "^2.2.6" + lodash "^4.17.21" + nanoid "^5.0.9" + preact "^10.5.13" + shallow-equal "^3.0.0" + +"@uppy/drag-drop@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@uppy/drag-drop/-/drag-drop-4.2.2.tgz#3982ec5da3995ec993ac25101196c4096e137b1b" + integrity sha512-SlVl+lHC8TvCKW4B9L4pdb0n8mEVgACHjKXGWcy7EUsTrRphv3ugmkbIFL57XpmFR+AFMuPblOsKq/9nkPkHOQ== + dependencies: + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/drop-target@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@uppy/drop-target/-/drop-target-3.2.2.tgz#daaa72534ed98595667659a6dc60c193ca5355b0" + integrity sha512-Y6wPDqmRE5BaOqKOkEfhURtN4qzCGshRn9nBC7jWfsmEhtXvxW6s25GPcuNHMyQIrn659aKLdi28bW7gvQoobg== + dependencies: + "@uppy/utils" "^6.2.2" + +"@uppy/dropbox@4.3.2", "@uppy/dropbox@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/dropbox/-/dropbox-4.3.2.tgz#16b787577deab93d228710ccb88491f8ab3a3cbd" + integrity sha512-Kj/QX8KFomlbf5mUpoCwxZ8dGH9XiN3RMKqT6zJgUk2bW7JfV2eMV6F9XvrVhz1TCtHZNl81Cv5rhu9io3UQ0w== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/facebook@4.3.2", "@uppy/facebook@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/facebook/-/facebook-4.3.2.tgz#a641239f4f3d559f24dfbc4b3cf1824145bc1e26" + integrity sha512-fHwFN8ZlRuNyxmuL7zwMLIegU+ARxegIlM3yJdY7RbRWgod/lUi5ouzTHjFgvLaFbuDtYWWRbZgF3GxCsXbmhA== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/file-input@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@uppy/file-input/-/file-input-4.2.2.tgz#4660c395127e7c3b2383bca565e1a678f2b25b58" + integrity sha512-tQklK5C1slZWQlMQYQPBJuhfs0e5w1sRb0VwYMt8P297rB1BUcyOjkVH79DAYHkkgXo9aQKUiZSuVoN89tlLjQ== + dependencies: + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/form@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@uppy/form/-/form-4.2.2.tgz#189df13ffaa08a37982d9452258209306c0a8287" + integrity sha512-bRX/mVLBE+ZOulkcPpp4wc0+cJrjoRerGE1EpAOjkskiCo4N7IuLR2f3ouHWnJvl98X/tOEwhWMMs1yys3M/yQ== + dependencies: + "@uppy/utils" "^6.2.2" + get-form-data "^3.0.0" + +"@uppy/golden-retriever@4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@uppy/golden-retriever/-/golden-retriever-4.2.3.tgz#35b182ba3499740ed5456de131dd41cec7efdc4d" + integrity sha512-IhPcyJQKFvozgzsciJvLCx3fb6LnRX+DmD8HKKJV+dtRVYT3gKX9xmH+LBeAqGnjdeJDESQXBh4PQconkMfeWw== + dependencies: + "@uppy/utils" "^6.2.2" + lodash "^4.17.21" + +"@uppy/google-drive-picker@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@uppy/google-drive-picker/-/google-drive-picker-0.4.2.tgz#8565c22ba0f1260dc72444222ba7a02f49029391" + integrity sha512-MPsrMZmT/ly99NlYr7p5soCOO8LJvcLLrzox7QjSuIWyiUmqcfRihdYUCJecP+rJhVZclXOI41ly/sCZdOb6sQ== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/google-drive@4.4.2", "@uppy/google-drive@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@uppy/google-drive/-/google-drive-4.4.2.tgz#5498bfc1c901a37bb0a7688d4bb80170f40451f1" + integrity sha512-hIxnWZ7WMW1jrRecL+VnMVt9TwY+V3uEpy7KmNxASraQFwS2oYgYUfO5R8MVcmL654wymQgEsRY7Kzp9NQvZGw== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/google-photos-picker@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@uppy/google-photos-picker/-/google-photos-picker-0.4.2.tgz#44dc01b4ead78809f9c9ffbb499bb2ac35263d47" + integrity sha512-FBU8+yktFGkL5JNAVIvQR3e7Nrp/Ur/99ihPY89EQFXBS+8eGZfSQNcSOiqAx1Rk/uW7BhoGFvbRB7TxafUQnA== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/image-editor@3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@uppy/image-editor/-/image-editor-3.4.2.tgz#07d5540d8c86fea163c08c248759f3bc1672eeeb" + integrity sha512-cQD/oDa/0xCuZAtdi4P2uLIxgrG/YR24KgKAxQYPzQHQtNB8KzCdl3TPV5ZWF9kjT4mSlUsoB4RfPQl34GbFhA== + dependencies: + "@uppy/utils" "^6.2.2" + cropperjs "^1.6.2" + preact "^10.5.13" + +"@uppy/informer@4.3.2", "@uppy/informer@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/informer/-/informer-4.3.2.tgz#d604511b7bc0daa3ae1e0fb8098eb99dd6d51503" + integrity sha512-7A9X8BfxR/GPtG0MGbQlmj1+G1o9fqeF3qtRh37ZvmZpapnEGtbstQ6Ao2vFm0uxYxOolLOMzFs/xCD27NKAvg== + dependencies: + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/instagram@4.3.2", "@uppy/instagram@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/instagram/-/instagram-4.3.2.tgz#c375237c2a566c4c9b1515b7c07012a3607cafce" + integrity sha512-LHGroKn8uRcRs94v6DM8SPXIMWubZb/aZr5B4FP7TvTzf3vnGaKE63oOen1yAoCEYbsJfSdo2p974qHbSdPEbw== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/locales@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@uppy/locales/-/locales-4.8.4.tgz#28a0774324ebc77b70ce42a05b70225be2362906" + integrity sha512-v0hjFaNSkWPcUjoHeOCcL3h3MC0ZhX/T0K1Li4rX6WiEIfZst/qThM/DHHwr8vpbBBV5kr7VBrB2SXuu4ywO3w== + dependencies: + "@uppy/utils" "^6.2.2" + +"@uppy/onedrive@4.3.2", "@uppy/onedrive@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/onedrive/-/onedrive-4.3.2.tgz#ae36a16f32babca6d312e3cc9da4c92c46a43425" + integrity sha512-dfJAl9qsoQsL1LdIrDPKEKmAj82VNA63BInsJ80nF8bx3tf67AvlMz4O1I9fDW2zctfgOiFlGz47kamz01eSPQ== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/progress-bar@4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/progress-bar/-/progress-bar-4.3.2.tgz#52696d0990b33cd572f0f52b95e1f494a84eb9b1" + integrity sha512-5BOhq49xPpBTlEVsEIRLkV+Hgb0qTuey8XKyrmrSetcgtolKLwtlDjrOWmUcxGYI3bkMbdeJulF9aiR8sSqQ6A== + dependencies: + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/provider-views@4.5.3", "@uppy/provider-views@^4.5.2": + version "4.5.3" + resolved "https://registry.yarnpkg.com/@uppy/provider-views/-/provider-views-4.5.3.tgz#ca634ccadfc1c0e4bb8ed8466a24adc0f8bec4c6" + integrity sha512-zExJSlkqRPl65KKG+SMTdP0OCawYMpo/FaKE8xjqHhx/rkACe6QNExCahpEGGjLo7Rr2j7FooAuA3UWmYiyWCg== + dependencies: + "@uppy/utils" "^6.2.2" + classnames "^2.2.6" + nanoid "^5.0.9" + p-queue "^8.0.0" + preact "^10.5.13" + +"@uppy/redux-dev-tools@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@uppy/redux-dev-tools/-/redux-dev-tools-4.1.3.tgz#b20c93809b7307298509347b4e5628e94e169eb3" + integrity sha512-cPhmUz2BRmYhMriv63HUo+3gsMlIXXQ6uON3uBPtzmeveCYmHLdjKooZTSf09THEN9TEE2F3mp5keuxneZeTMA== + +"@uppy/remote-sources@2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@uppy/remote-sources/-/remote-sources-2.4.2.tgz#ba80f38f93bc60671890e127cf7f91fd82a21f16" + integrity sha512-b8VVlriQWi/xU/LBuoLaQ3y2yMMLqXXJQpkG43tzBQG2R/sYz2qOm593BX9R4HjPQ891Vt4INjzfDTFziaA/4w== + dependencies: + "@uppy/box" "^3.3.2" + "@uppy/dashboard" "^4.4.2" + "@uppy/dropbox" "^4.3.2" + "@uppy/facebook" "^4.3.2" + "@uppy/google-drive" "^4.4.2" + "@uppy/instagram" "^4.3.2" + "@uppy/onedrive" "^4.3.2" + "@uppy/unsplash" "^4.4.2" + "@uppy/url" "^4.3.2" + "@uppy/zoom" "^3.3.2" + +"@uppy/screen-capture@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@uppy/screen-capture/-/screen-capture-4.4.2.tgz#3265e88790271bbc177430df689bbb5eb903a8d3" + integrity sha512-z2+Y34V8hs1lCeMB+culySW9WMBIL/19Z8OEkc0u6aHj3i6iCu0lwelPEaiUMdKHOXMyQTgn6Ubv+C3/OZlOpw== + dependencies: + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/status-bar@4.2.3", "@uppy/status-bar@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@uppy/status-bar/-/status-bar-4.2.3.tgz#afd937e0c21a3551d6b101c186ffa9375ffd1dc4" + integrity sha512-0AtKdvNm3HHobuE4N0V8SrC3uWB9MQnjqMEL/gachW/1mi7iZ22V4veHd6Wub/tCBQAQbEklvz7d0hxcz/Fh9g== + dependencies: + "@transloadit/prettier-bytes" "^0.3.4" + "@uppy/utils" "^6.2.2" + classnames "^2.2.6" + preact "^10.5.13" + +"@uppy/store-default@4.3.2", "@uppy/store-default@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/store-default/-/store-default-4.3.2.tgz#dd200b21e7c564729be5a1d688882f54709835cf" + integrity sha512-dnY9R2o8fwmO1bF89D0b5jijD7DGED2qVST5hI/j18JreLWzLKH7u6HuNmOvzok8msrQ/qWzQd5Gx4LDQKhBbw== + +"@uppy/store-redux@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@uppy/store-redux/-/store-redux-4.1.2.tgz#4c81c3f47d47b3fcd8f66adfaed12b13bbbb0267" + integrity sha512-jTcyO5HoazCE9e1oXFm6rVToGgd/8uVfo07r6y7bqXWwOPfGtY6DRXJZv/0H7cJa04Wdrfzl9Z7586z3jK+8lg== + dependencies: + nanoid "^5.0.9" + +"@uppy/thumbnail-generator@4.2.3", "@uppy/thumbnail-generator@^4.2.2": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@uppy/thumbnail-generator/-/thumbnail-generator-4.2.3.tgz#81dd5830fcdc0b14f4bd15a0a1354ec36a1939f4" + integrity sha512-qOfJzlHhaD8DmOH/50DMLNN5/E2qCYCJnikFgTZZbuPx6sUOtPGRrHBE8q/ELxVMB5gD3zGi/Fh2SwKGrGoxGA== + dependencies: + "@uppy/utils" "^6.2.2" + exifr "^7.0.0" + +"@uppy/transloadit@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@uppy/transloadit/-/transloadit-4.3.3.tgz#642aa82922569a2212f93d396d1226a6592888f3" + integrity sha512-ydaMCEEsUuMbGysJBwyvHF8I0SDXcHqnIxx3eGFBTMh5MXN63OUSC6tmChcAORiSUrsWR0E2guDwWBpTCjn78A== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/tus" "^4.3.2" + "@uppy/utils" "^6.2.2" + component-emitter "^2.0.0" + +"@uppy/tus@4.3.2", "@uppy/tus@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/tus/-/tus-4.3.2.tgz#cb1b440c16f76dc93e6f5c60ac71a3e3181e12b4" + integrity sha512-W9pXC/Xew6mM+XKbGafJI9flO3oQTFHxpd281SIy+hDFVTniAqW4VoNhcT15rDqlofQB+PufCXG1EJlX9pCIAw== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/utils" "^6.2.2" + tus-js-client "^4.2.3" + +"@uppy/unsplash@4.4.2", "@uppy/unsplash@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@uppy/unsplash/-/unsplash-4.4.2.tgz#1e3c2fe1498a57c5d653278592a857c8b1486781" + integrity sha512-1hO7ND/ROrRgZ8urCX38Q/o5rYs2uFGS7djxlNj/cz9xvRdkBagAzj3qp5FUsnPnJzJrRpifXcelvn3tICQjZg== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/url@4.3.2", "@uppy/url@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/url/-/url-4.3.2.tgz#bc941e25b757848d1b1ef507f098bf2381fadec1" + integrity sha512-SREfvV9IJxOg2MuzSVQBr2e9LTle8N0dsyUpsHddaSbbPku9KhkoilOiKuDMhPmvw9pnkYWBZhbw9+4UWnrQtQ== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/utils" "^6.2.2" + nanoid "^5.0.9" + preact "^10.5.13" + +"@uppy/utils@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@uppy/utils/-/utils-6.2.2.tgz#78bf41a38b6a64e8823063a34a8150412e386df4" + integrity sha512-9mYJtbcngv2HOJIECkyfmdXTI5dW/ObCyvWP1Iti3E5bKtsa4sMmbx5Yh/tGCj8k/lBNhfvWyZuYnvnjmzNLSQ== + dependencies: + lodash "^4.17.21" + preact "^10.5.13" + +"@uppy/webcam@4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@uppy/webcam/-/webcam-4.3.2.tgz#fe8ef3742768589c7ddf93b912a10ec313c0da2e" + integrity sha512-x0qhTWb7AjkfS9Q12J2xhnTdccZ6sMuBh14LpXtXjaFe4Q1Uf191YmFwT7SCKn7lcasZYw3Tug0G5yQkqvg9uQ== + dependencies: + "@uppy/utils" "^6.2.2" + is-mobile "^4.0.0" + preact "^10.5.13" + +"@uppy/webdav@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@uppy/webdav/-/webdav-0.4.2.tgz#bd6b82f80d3dc7301e06cac4fa1aa680443e679a" + integrity sha512-fo8u4YteGkWj32DsSTBT9dWC5wq0gM9M8lMFyVqVWORYK48KZzHIlxDtaKqzUQ26nh3EC1ZS3ZSsEfgWCwkyFA== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@uppy/xhr-upload@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@uppy/xhr-upload/-/xhr-upload-4.4.2.tgz#c6354eebfc2b9ad4f5495d35dff9e67acd0192f1" + integrity sha512-CU66aVn4yghGklEkepCqFPulc6uygznApy2DpD+jCMLNB5q6yT1RPSrQUgRgXsYhpW1YhutZJWsrEnHEDS+Tcw== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/utils" "^6.2.2" + +"@uppy/zoom@3.3.2", "@uppy/zoom@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@uppy/zoom/-/zoom-3.3.2.tgz#b95ff7568a2b63796da5856992c0c0620d98b8b3" + integrity sha512-e/yP3itmWh2U/A8SBLymVngDSIzmbq08eX0QzBrI5wIA1r38lD5tGlO2V9D70ujY8hNX7HQUqF+nK4OEgdUxJA== + dependencies: + "@uppy/companion-client" "^4.5.2" + "@uppy/provider-views" "^4.5.2" + "@uppy/utils" "^6.2.2" + preact "^10.5.13" + +"@volo/abp.aspnetcore.mvc.ui.theme.commercial@~9.3.5": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@volo/abp.aspnetcore.mvc.ui.theme.commercial/-/abp.aspnetcore.mvc.ui.theme.commercial-9.3.5.tgz#bff1254d4c714d0df6f10ee17cd3ec9c4bd3b38a" + integrity sha512-Q74JrCadrQuBna4kdHOjXIeEKOj6ENnIjDpoV7T7/Z7YWAzqGfAHKRZ6qbHt43keO1v8HlIRDLIYv05Bhl0htQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.3.5" + +"@volo/abp.aspnetcore.mvc.ui.theme.leptonx@~4.3.4": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@volo/abp.aspnetcore.mvc.ui.theme.leptonx/-/abp.aspnetcore.mvc.ui.theme.leptonx-4.3.5.tgz#938e41b9f2f53cd6a9260d7ce3a310d831d24ad6" + integrity sha512-vQXct0GkeeEPs9GCODCu9JJeDdg/RgqG+MScXhC5dV7pe7j9VDAVnlkesZFTWBF/w05FCEvI+xLWXqnYaPCl5g== + dependencies: + "@volo/abp.aspnetcore.mvc.ui.theme.commercial" "~9.3.5" + +"@volo/account@~9.3.4": + version "9.3.5" + resolved "https://registry.yarnpkg.com/@volo/account/-/account-9.3.5.tgz#6e89e2a21253914b8aa89e73c883551be5c6e714" + integrity sha512-D8G1wU1+hBHQMRlFTqTmcWkuD5RW3Ky9l9kPNj0TrzpLJOqPX8PrRmeE2yvFUQJu0okhozyyg4Fw8A3uMxOAvQ== + dependencies: + "@abp/cropperjs" "~9.3.5" + "@abp/qrcode" "~9.3.5" + "@abp/uppy" "~9.3.5" + "@abp/zxcvbn" "~9.3.5" + "@volo/abp.aspnetcore.mvc.ui.theme.commercial" "~9.3.5" + +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +blueimp-canvas-to-blob@^3.29.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz#d965f06cb1a67fdae207a2be56683f55ef531466" + integrity sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg== + +bootstrap-datepicker@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz#0a8bec42957ea1ce1272b91bcf2b53696629fb86" + integrity sha512-GIe+fsLp9Hi30oW7L2v2Q9/a4+aojrIA2p4ZagtLuKw2lpfQgjJjM0L6vl/lYQydGXWUbpoKbEC/O5tzWIkEKQ== + dependencies: + jquery ">=3.4.0 <4.0.0" + +bootstrap-daterangepicker@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8" + integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g== + dependencies: + jquery ">=1.10" + moment "^2.9.0" + +bootstrap@^5.3.3: + version "5.3.8" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.8.tgz#6401a10057a22752d21f4e19055508980656aeed" + integrity sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg== + +buffer-from@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +classnames@^2.2.6: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +combine-errors@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/combine-errors/-/combine-errors-3.0.3.tgz#f4df6740083e5703a3181110c2b10551f003da86" + integrity sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q== + dependencies: + custom-error-instance "2.1.1" + lodash.uniqby "4.5.0" + +component-emitter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-2.0.0.tgz#3a137dfe66fcf2efe3eab7cb7d5f51741b3620c6" + integrity sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw== + +compressorjs@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/compressorjs/-/compressorjs-1.2.1.tgz#4dee18ef5032f8166bd0a3258f045eda2cd07671" + integrity sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ== + dependencies: + blueimp-canvas-to-blob "^3.29.0" + is-blob "^2.1.0" + +cropperjs@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.6.2.tgz#d1a5d627d880581cca41b7901f06923500e4201b" + integrity sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA== + +custom-error-instance@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/custom-error-instance/-/custom-error-instance-2.1.1.tgz#3cf6391487a6629a6247eb0ca0ce00081b7e361a" + integrity sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg== + +datatables.net-bs5@^2.1.8: + version "2.3.4" + resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.4.tgz#63326190c20552c8c2c4d19a57ecdd10f0fe27ff" + integrity sha512-OSoPWhNfiU71VjNP604uTmFRxiX32U7SCW0KRZ2X6z3ZYbIwjjoWcMEjjPWOH3uOqaI0OTDBgOgOs5G28VaJog== + dependencies: + datatables.net "2.3.4" + jquery ">=1.7" + +datatables.net@2.3.4, datatables.net@^2.1.8: + version "2.3.4" + resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.4.tgz#8cf69f2e6cb8d271be3d5c4f75a479684d20f253" + integrity sha512-fKuRlrBIdpAl2uIFgl9enKecHB41QmFd/2nN9LBbOvItV/JalAxLcyqdZXex7wX4ZXjnJQEnv6xeS9veOpKzSw== + dependencies: + jquery ">=1.7" + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +exifr@^7.0.0: + version "7.1.3" + resolved "https://registry.yarnpkg.com/exifr/-/exifr-7.1.3.tgz#f6218012c36dbb7d843222011b27f065fddbab6f" + integrity sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw== + +get-form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-form-data/-/get-form-data-3.0.0.tgz#7abbf0e75e5ff155f75ba26eadeb9a4d70bf95dc" + integrity sha512-1d53Kn08wlPuLu31/boF1tW2WRYKw3xAWae3mqcjqpDjoqVBtXolbQnudbbEFyFWL7+2SLGRAFdotxNY06V7MA== + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +is-blob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" + integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== + +is-mobile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-4.0.0.tgz#bba396eb9656e2739afde3053d7191da310fc758" + integrity sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew== + +is-network-error@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512" + integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +jquery-form@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" + integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== + dependencies: + jquery ">=1.7.2" + +jquery-mousewheel@>=3.0.6: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz#48c833f6260ee0c46d438a999e7d0060ec9eed0b" + integrity sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ== + dependencies: + jquery ">=1.2.6" + +jquery-validation-unobtrusive@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#dfcf25a558496a2c883db6021d10f5398d15f99d" + integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ== + dependencies: + jquery "^3.6.0" + jquery-validation ">=1.19" + +jquery-validation@>=1.19, jquery-validation@^1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" + integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== + +jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" + integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== + +js-base64@^3.7.2: + version "3.7.8" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.8.tgz#af44496bc09fa178ed9c4adf67eb2b46f5c6d2a4" + integrity sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow== + +just-compare@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-2.3.0.tgz#a2adcc1d1940536263275f5a1ef1298bcacfeda7" + integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg== + +lodash._baseiteratee@~4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz#34a9b5543572727c3db2e78edae3c0e9e66bd102" + integrity sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ== + dependencies: + lodash._stringtopath "~4.8.0" + +lodash._basetostring@~4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz#9327c9dc5158866b7fa4b9d42f4638e5766dd9df" + integrity sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw== + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + integrity sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A== + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + integrity sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA== + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ== + +lodash._stringtopath@~4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz#941bcf0e64266e5fc1d66fed0a6959544c576824" + integrity sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ== + dependencies: + lodash._basetostring "~4.12.0" + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash.uniqby@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz#a3a17bbf62eeb6240f491846e97c1c4e2a5e1e21" + integrity sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ== + dependencies: + lodash._baseiteratee "~4.7.0" + lodash._baseuniq "~4.6.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +luxon@^3.5.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" + integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== + +malihu-custom-scrollbar-plugin@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef" + integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ== + dependencies: + jquery-mousewheel ">=3.0.6" + +mime-match@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" + integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg== + dependencies: + wildcard "^1.1.0" + +moment@^2.30.1, moment@^2.9.0: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +namespace-emitter@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c" + integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g== + +nanoid@^5.0.9: + version "5.1.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.6.tgz#30363f664797e7d40429f6c16946d6bd7a3f26c9" + integrity sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg== + +p-queue@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.1.1.tgz#dac3e8c57412fffa18fe6c341b141dbb3a16408b" + integrity sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^6.1.2" + +p-retry@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" + retry "^0.13.1" + +p-timeout@^6.1.2: + version "6.1.4" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.4.tgz#418e1f4dd833fa96a2e3f532547dd2abdb08dbc2" + integrity sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg== + +preact@^10.5.13: + version "10.27.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.27.2.tgz#19b9009c1be801a76a0aaf0fe5ba665985a09312" + integrity sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg== + +promise-queue@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/promise-queue/-/promise-queue-2.2.5.tgz#2f6f5f7c0f6d08109e967659c79b88a9ed5e93b4" + integrity sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ== + +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +select2@^4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d" + integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw== + +shallow-equal@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-3.1.0.tgz#e7a54bac629c7f248eff6c2f5b63122ba4320bec" + integrity sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg== + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sweetalert2@^11.14.1: + version "11.23.0" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.23.0.tgz#ba8a051b1e94215c762af08692171b7b4611c4c1" + integrity sha512-cKzzbC3C1sIs7o9XAMw4E8F9kBtGXsBDUsd2JZ8JM/dqa+nzWwSGM+9LLYILZWzWHzX9W+HJNHyBlbHPVS/krw== + +timeago@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5" + integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ== + dependencies: + jquery ">=1.5.0 <4.0" + +tus-js-client@^4.2.3: + version "4.3.1" + resolved "https://registry.yarnpkg.com/tus-js-client/-/tus-js-client-4.3.1.tgz#2f9a47fba006206fb0d08c649fa01254944d5d87" + integrity sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg== + dependencies: + buffer-from "^1.1.2" + combine-errors "^3.0.3" + is-stream "^2.0.0" + js-base64 "^3.7.2" + lodash.throttle "^4.1.1" + proper-lockfile "^4.1.2" + url-parse "^1.5.7" + +uppy@^4.4.1: + version "4.18.3" + resolved "https://registry.yarnpkg.com/uppy/-/uppy-4.18.3.tgz#3c8b7bb2ee1886147158d60f113f0a6b903f218d" + integrity sha512-PV7yVn062TP/3FJEl6toqiQZlVMDXWzQzBZLfVzfqeZ8G7iU5KwBYPTgO1UBjRBAfS3NeCOfeGzhZK6KWACcDQ== + dependencies: + "@uppy/audio" "2.2.2" + "@uppy/aws-s3" "4.3.2" + "@uppy/box" "3.3.2" + "@uppy/companion-client" "4.5.2" + "@uppy/compressor" "2.3.2" + "@uppy/core" "4.5.3" + "@uppy/dashboard" "4.4.3" + "@uppy/drag-drop" "4.2.2" + "@uppy/drop-target" "3.2.2" + "@uppy/dropbox" "4.3.2" + "@uppy/facebook" "4.3.2" + "@uppy/file-input" "4.2.2" + "@uppy/form" "4.2.2" + "@uppy/golden-retriever" "4.2.3" + "@uppy/google-drive" "4.4.2" + "@uppy/google-drive-picker" "0.4.2" + "@uppy/google-photos-picker" "0.4.2" + "@uppy/image-editor" "3.4.2" + "@uppy/informer" "4.3.2" + "@uppy/instagram" "4.3.2" + "@uppy/locales" "4.8.4" + "@uppy/onedrive" "4.3.2" + "@uppy/progress-bar" "4.3.2" + "@uppy/provider-views" "4.5.3" + "@uppy/redux-dev-tools" "4.1.3" + "@uppy/remote-sources" "2.4.2" + "@uppy/screen-capture" "4.4.2" + "@uppy/status-bar" "4.2.3" + "@uppy/store-default" "4.3.2" + "@uppy/store-redux" "4.1.2" + "@uppy/thumbnail-generator" "4.2.3" + "@uppy/transloadit" "4.3.3" + "@uppy/tus" "4.3.2" + "@uppy/unsplash" "4.4.2" + "@uppy/url" "4.3.2" + "@uppy/webcam" "4.3.2" + "@uppy/webdav" "0.4.2" + "@uppy/xhr-upload" "4.4.2" + "@uppy/zoom" "3.3.2" + +url-parse@^1.5.7: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +wildcard@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5" + integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng== + +zxcvbn@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/zxcvbn/-/zxcvbn-4.4.2.tgz#28ec17cf09743edcab056ddd8b1b06262cc73c30" + integrity sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ== diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg new file mode 100644 index 0000000000..b3fd588610 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg.analyze.json b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg.analyze.json new file mode 100644 index 0000000000..88efd1bd83 --- /dev/null +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.abppkg.analyze.json @@ -0,0 +1,118 @@ +{ + "name": "Acme.BookStore.HttpApi", + "hash": "", + "contents": [ + { + "namespace": "Acme.BookStore", + "dependsOnModules": [ + { + "declaringAssemblyName": "Acme.BookStore.Application.Contracts", + "namespace": "Acme.BookStore", + "name": "BookStoreApplicationContractsModule" + }, + { + "declaringAssemblyName": "Volo.Abp.PermissionManagement.HttpApi", + "namespace": "Volo.Abp.PermissionManagement.HttpApi", + "name": "AbpPermissionManagementHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.HttpApi", + "namespace": "Volo.Abp.SettingManagement", + "name": "AbpSettingManagementHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Identity.Pro.HttpApi", + "namespace": "Volo.Abp.Identity", + "name": "AbpIdentityHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Admin.HttpApi", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountAdminHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.TextTemplateManagement.HttpApi", + "namespace": "Volo.Abp.TextTemplateManagement", + "name": "TextTemplateManagementHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.AuditLogging.HttpApi", + "namespace": "Volo.Abp.AuditLogging", + "name": "AbpAuditLoggingHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.HttpApi", + "namespace": "Volo.Abp.OpenIddict", + "name": "AbpOpenIddictProHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.LanguageManagement.HttpApi", + "namespace": "Volo.Abp.LanguageManagement", + "name": "LanguageManagementHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Gdpr.HttpApi", + "namespace": "Volo.Abp.Gdpr", + "name": "AbpGdprHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.Account.Pro.Public.HttpApi", + "namespace": "Volo.Abp.Account", + "name": "AbpAccountPublicHttpApiModule" + }, + { + "declaringAssemblyName": "Volo.Abp.FeatureManagement.HttpApi", + "namespace": "Volo.Abp.FeatureManagement", + "name": "AbpFeatureManagementHttpApiModule" + } + ], + "implementingInterfaces": [ + { + "name": "IAbpModule", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IAbpModule" + }, + { + "name": "IOnPreApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" + }, + { + "name": "IOnApplicationInitialization", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationInitialization" + }, + { + "name": "IOnPostApplicationInitialization", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" + }, + { + "name": "IOnApplicationShutdown", + "namespace": "Volo.Abp", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.IOnApplicationShutdown" + }, + { + "name": "IPreConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPreConfigureServices" + }, + { + "name": "IPostConfigureServices", + "namespace": "Volo.Abp.Modularity", + "declaringAssemblyName": "Volo.Abp.Core", + "fullName": "Volo.Abp.Modularity.IPostConfigureServices" + } + ], + "contentType": "abpModule", + "name": "BookStoreHttpApiModule", + "summary": null + } + ] +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj index 1d22811804..4e12bacf07 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj @@ -1,23 +1,33 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs index 2836808b07..64396c4ac9 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs @@ -1,41 +1,52 @@ -using Localization.Resources.AbpUi; -using Acme.BookStore.Localization; -using Volo.Abp.Account; -using Volo.Abp.FeatureManagement; -using Volo.Abp.Identity; -using Volo.Abp.Localization; -using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement.HttpApi; -using Volo.Abp.SettingManagement; -using Volo.Abp.TenantManagement; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreApplicationContractsModule), - typeof(AbpAccountHttpApiModule), - typeof(AbpIdentityHttpApiModule), - typeof(AbpPermissionManagementHttpApiModule), - typeof(AbpTenantManagementHttpApiModule), - typeof(AbpFeatureManagementHttpApiModule), - typeof(AbpSettingManagementHttpApiModule) - )] -public class BookStoreHttpApiModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - ConfigureLocalization(); - } - - private void ConfigureLocalization() - { - Configure(options => - { - options.Resources - .Get() - .AddBaseTypes( - typeof(AbpUiResource) - ); - }); - } -} +using Localization.Resources.AbpUi; +using Acme.BookStore.Localization; +using Volo.Abp.Account; +using Volo.Abp.SettingManagement; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.HttpApi; +using Volo.Abp.Localization; +using Volo.Abp.AuditLogging; +using Volo.Abp.LanguageManagement; +using Volo.Saas.Host; +using Volo.Abp.TextTemplateManagement; +using Volo.Abp.Gdpr; +using Volo.Abp.OpenIddict; + +namespace Acme.BookStore; + + [DependsOn( + typeof(BookStoreApplicationContractsModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpSettingManagementHttpApiModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpAccountAdminHttpApiModule), + typeof(TextTemplateManagementHttpApiModule), + typeof(AbpAuditLoggingHttpApiModule), + typeof(AbpOpenIddictProHttpApiModule), + typeof(LanguageManagementHttpApiModule), + typeof(SaasHostHttpApiModule), + typeof(AbpGdprHttpApiModule), + typeof(AbpAccountPublicHttpApiModule), + typeof(AbpFeatureManagementHttpApiModule) + )] +public class BookStoreHttpApiModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + ConfigureLocalization(); + } + + private void ConfigureLocalization() + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpUiResource) + ); + }); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs index a8866e97f2..fe9e90de8c 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs @@ -1,14 +1,14 @@ -using Acme.BookStore.Localization; -using Volo.Abp.AspNetCore.Mvc; - -namespace Acme.BookStore.Controllers; - -/* Inherit your controllers from this class. - */ -public abstract class BookStoreController : AbpControllerBase -{ - protected BookStoreController() - { - LocalizationResource = typeof(BookStoreResource); - } -} +using Acme.BookStore.Localization; +using Volo.Abp.AspNetCore.Mvc; + +namespace Acme.BookStore.Controllers; + +/* Inherit your controllers from this class. + */ +public abstract class BookStoreController : AbpControllerBase +{ + protected BookStoreController() + { + LocalizationResource = typeof(BookStoreResource); + } +} diff --git a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs index 2aadd6ef38..e13a993f6c 100644 --- a/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs +++ b/BookStore-Blazor-EfCore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs @@ -1,10 +1,10 @@ -using System; - -namespace Acme.BookStore.Models.Test; - -public class TestModel -{ - public string Name { get; set; } - - public DateTime BirthDate { get; set; } -} +using System; + +namespace Acme.BookStore.Models.Test; + +public class TestModel +{ + public string? Name { get; set; } + + public DateTime BirthDate { get; set; } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.abppkg b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.abppkg new file mode 100644 index 0000000000..d6829692fc --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj index 38925e955a..5ee90d0d70 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj @@ -1,19 +1,20 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Authors/AuthorAppService_Tests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Authors/AuthorAppService_Tests.cs index 9496c43c83..f7899ed776 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Authors/AuthorAppService_Tests.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Authors/AuthorAppService_Tests.cs @@ -1,72 +1,71 @@ -using System; -using System.Threading.Tasks; -using Shouldly; -using Xunit; - -namespace Acme.BookStore.Authors -{ - public class AuthorAppService_Tests : BookStoreApplicationTestBase - { - private readonly IAuthorAppService _authorAppService; - - public AuthorAppService_Tests() - { - _authorAppService = GetRequiredService(); - } - - [Fact] - public async Task Should_Get_All_Authors_Without_Any_Filter() - { - var result = await _authorAppService.GetListAsync(new GetAuthorListDto()); - - result.TotalCount.ShouldBeGreaterThanOrEqualTo(2); - result.Items.ShouldContain(author => author.Name == "George Orwell"); - result.Items.ShouldContain(author => author.Name == "Douglas Adams"); - } - - [Fact] - public async Task Should_Get_Filtered_Authors() - { - var result = await _authorAppService.GetListAsync( - new GetAuthorListDto { Filter = "George" }); - - result.TotalCount.ShouldBeGreaterThanOrEqualTo(1); - result.Items.ShouldContain(author => author.Name == "George Orwell"); - result.Items.ShouldNotContain(author => author.Name == "Douglas Adams"); - } - - [Fact] - public async Task Should_Create_A_New_Author() - { - var authorDto = await _authorAppService.CreateAsync( - new CreateAuthorDto - { - Name = "Edward Bellamy", - BirthDate = new DateTime(1850, 05, 22), - ShortBio = "Edward Bellamy was an American author..." - } - ); - - authorDto.Id.ShouldNotBe(Guid.Empty); - authorDto.Name.ShouldBe("Edward Bellamy"); - } - - [Fact] - public async Task Should_Not_Allow_To_Create_Duplicate_Author() - { - await Assert.ThrowsAsync(async () => - { - await _authorAppService.CreateAsync( - new CreateAuthorDto - { - Name = "Douglas Adams", - BirthDate = DateTime.Now, - ShortBio = "..." - } - ); - }); - } - - //TODO: Test other methods... - } -} +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Modularity; +using Xunit; + +namespace Acme.BookStore.Authors; + +public abstract class AuthorAppService_Tests : BookStoreApplicationTestBase + where TStartupModule : IAbpModule +{ + private readonly IAuthorAppService _authorAppService; + + protected AuthorAppService_Tests() + { + _authorAppService = GetRequiredService(); + } + + [Fact] + public async Task Should_Get_All_Authors_Without_Any_Filter() + { + var result = await _authorAppService.GetListAsync(new GetAuthorListDto()); + + result.TotalCount.ShouldBeGreaterThanOrEqualTo(2); + result.Items.ShouldContain(author => author.Name == "George Orwell"); + result.Items.ShouldContain(author => author.Name == "Douglas Adams"); + } + + [Fact] + public async Task Should_Get_Filtered_Authors() + { + var result = await _authorAppService.GetListAsync( + new GetAuthorListDto { Filter = "George" }); + + result.TotalCount.ShouldBeGreaterThanOrEqualTo(1); + result.Items.ShouldContain(author => author.Name == "George Orwell"); + result.Items.ShouldNotContain(author => author.Name == "Douglas Adams"); + } + + [Fact] + public async Task Should_Create_A_New_Author() + { + var authorDto = await _authorAppService.CreateAsync( + new CreateAuthorDto + { + Name = "Edward Bellamy", + BirthDate = new DateTime(1850, 05, 22), + ShortBio = "Edward Bellamy was an American author..." + } + ); + + authorDto.Id.ShouldNotBe(Guid.Empty); + authorDto.Name.ShouldBe("Edward Bellamy"); + } + + [Fact] + public async Task Should_Not_Allow_To_Create_Duplicate_Author() + { + await Assert.ThrowsAsync(async () => + { + await _authorAppService.CreateAsync( + new CreateAuthorDto + { + Name = "Douglas Adams", + BirthDate = DateTime.Now, + ShortBio = "..." + } + ); + }); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs index cfc441a69b..118b521a52 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs @@ -1,6 +1,9 @@ -namespace Acme.BookStore; - -public abstract class BookStoreApplicationTestBase : BookStoreTestBase -{ - -} +using Volo.Abp.Modularity; + +namespace Acme.BookStore; + +public abstract class BookStoreApplicationTestBase : BookStoreTestBase + where TStartupModule : IAbpModule +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs index 46c54b38df..759982137d 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs @@ -1,12 +1,12 @@ -using Volo.Abp.Modularity; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreApplicationModule), - typeof(BookStoreDomainTestModule) - )] -public class BookStoreApplicationTestModule : AbpModule -{ - -} +using Volo.Abp.Modularity; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreApplicationModule), + typeof(BookStoreDomainTestModule) +)] +public class BookStoreApplicationTestModule : AbpModule +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Books/BookAppService_Tests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Books/BookAppService_Tests.cs index 8882e93800..f1c471c6c2 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Books/BookAppService_Tests.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Books/BookAppService_Tests.cs @@ -1,79 +1,81 @@ -using Acme.BookStore.Authors; -using Shouldly; -using System; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Validation; -using Xunit; - -namespace Acme.BookStore.Books; - -public class BookAppService_Tests : BookStoreApplicationTestBase -{ - private readonly IBookAppService _bookAppService; - private readonly IAuthorAppService _authorAppService; - - public BookAppService_Tests() - { - _bookAppService = GetRequiredService(); - _authorAppService = GetRequiredService(); - } - - [Fact] - public async Task Should_Get_List_Of_Books() - { - //Act - var result = await _bookAppService.GetListAsync( - new PagedAndSortedResultRequestDto() - ); - - //Assert - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(b => b.Name == "1984" && - b.AuthorName == "George Orwell"); - } - - [Fact] - public async Task Should_Create_A_Valid_Book() - { - var authors = await _authorAppService.GetListAsync(new GetAuthorListDto()); - var firstAuthor = authors.Items.First(); - - //Act - var result = await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - AuthorId = firstAuthor.Id, - Name = "New test book 42", - Price = 10, - PublishDate = System.DateTime.Now, - Type = BookType.ScienceFiction - } - ); - - //Assert - result.Id.ShouldNotBe(Guid.Empty); - result.Name.ShouldBe("New test book 42"); - } - - [Fact] - public async Task Should_Not_Create_A_Book_Without_Name() - { - var exception = await Assert.ThrowsAsync(async () => - { - await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction - } - ); - }); - - exception.ValidationErrors - .ShouldContain(err => err.MemberNames.Any(m => m == "Name")); - } -} +using System; +using System.Linq; +using System.Threading.Tasks; +using Acme.BookStore.Authors; +using Shouldly; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Xunit; + +namespace Acme.BookStore.Books; + +public abstract class BookAppService_Tests : BookStoreApplicationTestBase + where TStartupModule : IAbpModule +{ + private readonly IBookAppService _bookAppService; + private readonly IAuthorAppService _authorAppService; + + protected BookAppService_Tests() + { + _bookAppService = GetRequiredService(); + _authorAppService = GetRequiredService(); + } + + [Fact] + public async Task Should_Get_List_Of_Books() + { + //Act + var result = await _bookAppService.GetListAsync( + new PagedAndSortedResultRequestDto() + ); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(b => b.Name == "1984" && + b.AuthorName == "George Orwell"); + } + + [Fact] + public async Task Should_Create_A_Valid_Book() + { + var authors = await _authorAppService.GetListAsync(new GetAuthorListDto()); + var firstAuthor = authors.Items.First(); + + //Act + var result = await _bookAppService.CreateAsync( + new CreateUpdateBookDto + { + AuthorId = firstAuthor.Id, + Name = "New test book 42", + Price = 10, + PublishDate = System.DateTime.Now, + Type = BookType.ScienceFiction + } + ); + + //Assert + result.Id.ShouldNotBe(Guid.Empty); + result.Name.ShouldBe("New test book 42"); + } + + [Fact] + public async Task Should_Not_Create_A_Book_Without_Name() + { + var exception = await Assert.ThrowsAsync(async () => + { + await _bookAppService.CreateAsync( + new CreateUpdateBookDto + { + Name = "", + Price = 10, + PublishDate = DateTime.Now, + Type = BookType.ScienceFiction + } + ); + }); + + exception.ValidationErrors + .ShouldContain(err => err.MemberNames.Any(m => m == "Name")); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs index 6b6d61941c..ab8c6cb318 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs @@ -1,32 +1,34 @@ -using Shouldly; -using System.Threading.Tasks; -using Volo.Abp.Identity; -using Xunit; - -namespace Acme.BookStore.Samples; - -/* This is just an example test class. - * Normally, you don't test code of the modules you are using - * (like IIdentityUserAppService here). - * Only test your own application services. - */ -public class SampleAppServiceTests : BookStoreApplicationTestBase -{ - private readonly IIdentityUserAppService _userAppService; - - public SampleAppServiceTests() - { - _userAppService = GetRequiredService(); - } - - [Fact] - public async Task Initial_Data_Should_Contain_Admin_User() - { - //Act - var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); - - //Assert - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(u => u.UserName == "admin"); - } -} +using Shouldly; +using System.Threading.Tasks; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Xunit; + +namespace Acme.BookStore.Samples; + +/* This is just an example test class. + * Normally, you don't test code of the modules you are using + * (like IIdentityUserAppService here). + * Only test your own application services. + */ +public abstract class SampleAppServiceTests : BookStoreApplicationTestBase + where TStartupModule : IAbpModule +{ + private readonly IIdentityUserAppService _userAppService; + + protected SampleAppServiceTests() + { + _userAppService = GetRequiredService(); + } + + [Fact] + public async Task Initial_Data_Should_Contain_Admin_User() + { + //Act + var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(u => u.UserName == "admin"); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.abppkg b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.abppkg new file mode 100644 index 0000000000..d6829692fc --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj index ffa5fcc4b6..1ab2f96668 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj @@ -1,18 +1,20 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs index f843b17f3f..4b45a109eb 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs @@ -1,6 +1,10 @@ -namespace Acme.BookStore; - -public abstract class BookStoreDomainTestBase : BookStoreTestBase -{ - -} +using Volo.Abp.Modularity; + +namespace Acme.BookStore; + +/* Inherit from this class for your domain layer tests. */ +public abstract class BookStoreDomainTestBase : BookStoreTestBase + where TStartupModule : IAbpModule +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs index 41f6edd34b..6312a1a52a 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs @@ -1,12 +1,12 @@ -using Acme.BookStore.EntityFrameworkCore; -using Volo.Abp.Modularity; - -namespace Acme.BookStore; - -[DependsOn( - typeof(BookStoreEntityFrameworkCoreTestModule) - )] -public class BookStoreDomainTestModule : AbpModule -{ - -} +using Volo.Abp.Modularity; + +namespace Acme.BookStore; + +[DependsOn( + typeof(BookStoreDomainModule), + typeof(BookStoreTestBaseModule) +)] +public class BookStoreDomainTestModule : AbpModule +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs index 18413f75b1..831773d230 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs @@ -1,44 +1,46 @@ -using System.Threading.Tasks; -using Shouldly; -using Volo.Abp.Identity; -using Xunit; - -namespace Acme.BookStore.Samples; - -/* This is just an example test class. - * Normally, you don't test code of the modules you are using - * (like IdentityUserManager here). - * Only test your own domain services. - */ -public class SampleDomainTests : BookStoreDomainTestBase -{ - private readonly IIdentityUserRepository _identityUserRepository; - private readonly IdentityUserManager _identityUserManager; - - public SampleDomainTests() - { - _identityUserRepository = GetRequiredService(); - _identityUserManager = GetRequiredService(); - } - - [Fact] - public async Task Should_Set_Email_Of_A_User() - { - IdentityUser adminUser; - - /* Need to manually start Unit Of Work because - * FirstOrDefaultAsync should be executed while db connection / context is available. - */ - await WithUnitOfWorkAsync(async () => - { - adminUser = await _identityUserRepository - .FindByNormalizedUserNameAsync("ADMIN"); - - await _identityUserManager.SetEmailAsync(adminUser, "newemail@abp.io"); - await _identityUserRepository.UpdateAsync(adminUser); - }); - - adminUser = await _identityUserRepository.FindByNormalizedUserNameAsync("ADMIN"); - adminUser.Email.ShouldBe("newemail@abp.io"); - } -} +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Xunit; + +namespace Acme.BookStore.Samples; + +/* This is just an example test class. + * Normally, you don't test code of the modules you are using + * (like IdentityUserManager here). + * Only test your own domain services. + */ +public abstract class SampleDomainTests : BookStoreDomainTestBase + where TStartupModule : IAbpModule +{ + private readonly IIdentityUserRepository _identityUserRepository; + private readonly IdentityUserManager _identityUserManager; + + protected SampleDomainTests() + { + _identityUserRepository = GetRequiredService(); + _identityUserManager = GetRequiredService(); + } + + [Fact] + public async Task Should_Set_Email_Of_A_User() + { + IdentityUser adminUser; + + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + await WithUnitOfWorkAsync(async () => + { + adminUser = await _identityUserRepository + .FindByNormalizedUserNameAsync("ADMIN"); + + await _identityUserManager.SetEmailAsync(adminUser, "newemail@abp.io"); + await _identityUserRepository.UpdateAsync(adminUser); + }); + + adminUser = await _identityUserRepository.FindByNormalizedUserNameAsync("ADMIN"); + adminUser.Email.ShouldBe("newemail@abp.io"); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.abppkg b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.abppkg new file mode 100644 index 0000000000..d6829692fc --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj index 153b0b6876..2dbde78aac 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj @@ -1,20 +1,21 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Authors/EfCoreAuthorAppService_Tests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Authors/EfCoreAuthorAppService_Tests.cs new file mode 100644 index 0000000000..29da8bd4fd --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Authors/EfCoreAuthorAppService_Tests.cs @@ -0,0 +1,10 @@ +using Acme.BookStore.Authors; +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore.Applications.Authors; + +[Collection(BookStoreTestConsts.CollectionDefinitionName)] +public class EfCoreAuthorAppService_Tests : AuthorAppService_Tests +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Books/EfCoreBookAppService_Tests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Books/EfCoreBookAppService_Tests.cs new file mode 100644 index 0000000000..70343a33bb --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Books/EfCoreBookAppService_Tests.cs @@ -0,0 +1,10 @@ +using Acme.BookStore.Books; +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore.Applications.Books; + +[Collection(BookStoreTestConsts.CollectionDefinitionName)] +public class EfCoreBookAppService_Tests : BookAppService_Tests +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs new file mode 100644 index 0000000000..74228ffa26 --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs @@ -0,0 +1,10 @@ +using Acme.BookStore.Samples; +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore.Applications; + +[Collection(BookStoreTestConsts.CollectionDefinitionName)] +public class EfCoreSampleAppServiceTests : SampleAppServiceTests +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollection.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollection.cs new file mode 100644 index 0000000000..0924fc52f2 --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollection.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore; + +[CollectionDefinition(BookStoreTestConsts.CollectionDefinitionName)] +public class BookStoreEntityFrameworkCoreCollection : ICollectionFixture +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollectionFixtureBase.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollectionFixtureBase.cs new file mode 100644 index 0000000000..f579b58d5c --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreCollectionFixtureBase.cs @@ -0,0 +1,9 @@ +using Acme.BookStore.EntityFrameworkCore; +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore; + +public class BookStoreEntityFrameworkCoreCollectionFixtureBase : ICollectionFixture +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreFixture.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreFixture.cs new file mode 100644 index 0000000000..7f7deffdf6 --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreFixture.cs @@ -0,0 +1,11 @@ +using System; + +namespace Acme.BookStore.EntityFrameworkCore; + +public class BookStoreEntityFrameworkCoreFixture : IDisposable +{ + public void Dispose() + { + + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs index 0d3786f388..2ba5f083e8 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs @@ -1,8 +1,8 @@ -using Volo.Abp; - -namespace Acme.BookStore.EntityFrameworkCore; - -public abstract class BookStoreEntityFrameworkCoreTestBase : BookStoreTestBase -{ - -} +using Volo.Abp; + +namespace Acme.BookStore.EntityFrameworkCore; + +public abstract class BookStoreEntityFrameworkCoreTestBase : BookStoreTestBase +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs index d85b6cfc41..92201ab51a 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs @@ -1,61 +1,83 @@ -using Microsoft.Data.Sqlite; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore.Sqlite; -using Volo.Abp.Modularity; - -namespace Acme.BookStore.EntityFrameworkCore; - -[DependsOn( - typeof(BookStoreEntityFrameworkCoreModule), - typeof(BookStoreTestBaseModule), - typeof(AbpEntityFrameworkCoreSqliteModule) - )] -public class BookStoreEntityFrameworkCoreTestModule : AbpModule -{ - private SqliteConnection _sqliteConnection; - - public override void ConfigureServices(ServiceConfigurationContext context) - { - ConfigureInMemorySqlite(context.Services); - } - - private void ConfigureInMemorySqlite(IServiceCollection services) - { - _sqliteConnection = CreateDatabaseAndGetConnection(); - - services.Configure(options => - { - options.Configure(context => - { - context.DbContextOptions.UseSqlite(_sqliteConnection); - }); - }); - } - - public override void OnApplicationShutdown(ApplicationShutdownContext context) - { - _sqliteConnection.Dispose(); - } - - private static SqliteConnection CreateDatabaseAndGetConnection() - { - var connection = new SqliteConnection("Data Source=:memory:"); - connection.Open(); - - var options = new DbContextOptionsBuilder() - .UseSqlite(connection) - .Options; - - using (var context = new BookStoreDbContext(options)) - { - context.GetService().CreateTables(); - } - - return connection; - } -} +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Sqlite; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.TextTemplateManagement; +using Volo.Abp.Uow; + +namespace Acme.BookStore.EntityFrameworkCore; + +[DependsOn( + typeof(BookStoreApplicationTestModule), + typeof(BookStoreEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCoreSqliteModule) +)] +public class BookStoreEntityFrameworkCoreTestModule : AbpModule +{ + private SqliteConnection? _sqliteConnection; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.SaveStaticFeaturesToDatabase = false; + options.IsDynamicFeatureStoreEnabled = false; + }); + Configure(options => + { + options.SaveStaticPermissionsToDatabase = false; + options.IsDynamicPermissionStoreEnabled = false; + }); + Configure(options => + { + options.SaveStaticTemplatesToDatabase = false; + options.IsDynamicTemplateStoreEnabled = false; + }); + context.Services.AddAlwaysDisableUnitOfWorkTransaction(); + + ConfigureInMemorySqlite(context.Services); + + } + + private void ConfigureInMemorySqlite(IServiceCollection services) + { + _sqliteConnection = CreateDatabaseAndGetConnection(); + + services.Configure(options => + { + options.Configure(context => + { + context.DbContextOptions.UseSqlite(_sqliteConnection); + }); + }); + } + + public override void OnApplicationShutdown(ApplicationShutdownContext context) + { + _sqliteConnection?.Dispose(); + } + + private static SqliteConnection CreateDatabaseAndGetConnection() + { + var connection = new SqliteConnection("Data Source=:memory:"); + connection.Open(); + + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + using (var context = new BookStoreDbContext(options)) + { + context.GetService().CreateTables(); + } + + return connection; + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs new file mode 100644 index 0000000000..5c75ab4ac1 --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs @@ -0,0 +1,10 @@ +using Acme.BookStore.Samples; +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore.Domains; + +[Collection(BookStoreTestConsts.CollectionDefinitionName)] +public class EfCoreSampleDomainTests : SampleDomainTests +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs index 95a9b09f25..d1744077e5 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs @@ -1,43 +1,40 @@ -using Microsoft.EntityFrameworkCore; -using Shouldly; -using System; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.Identity; -using Xunit; - -namespace Acme.BookStore.EntityFrameworkCore.Samples; - -/* This is just an example test class. - * Normally, you don't test ABP framework code - * (like default AppUser repository IRepository here). - * Only test your custom repository methods. - */ -public class SampleRepositoryTests : BookStoreEntityFrameworkCoreTestBase -{ - private readonly IRepository _appUserRepository; - - public SampleRepositoryTests() - { - _appUserRepository = GetRequiredService>(); - } - - [Fact] - public async Task Should_Query_AppUser() - { - /* Need to manually start Unit Of Work because - * FirstOrDefaultAsync should be executed while db connection / context is available. - */ - await WithUnitOfWorkAsync(async () => - { - //Act - var adminUser = await (await _appUserRepository.GetQueryableAsync()) - .Where(u => u.UserName == "admin") - .FirstOrDefaultAsync(); - - //Assert - adminUser.ShouldNotBeNull(); - }); - } -} +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; +using Xunit; + +namespace Acme.BookStore.EntityFrameworkCore.Samples; + +/* This is just an example test class. + * Normally, you don't test ABP framework code + * Only test your custom repository methods. + */ +[Collection(BookStoreTestConsts.CollectionDefinitionName)] +public class SampleRepositoryTests : BookStoreEntityFrameworkCoreTestBase +{ + private readonly IRepository _appUserRepository; + + public SampleRepositoryTests() + { + _appUserRepository = GetRequiredService>(); + } + + [Fact] + public async Task Should_Query_AppUser() + { + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + await WithUnitOfWorkAsync(async () => + { + //Act + var adminUser = await _appUserRepository + .FirstOrDefaultAsync(u => u.UserName == "admin"); + + //Assert + adminUser.ShouldNotBeNull(); + }); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.abppkg b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.abppkg new file mode 100644 index 0000000000..d6829692fc --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj index 296bca23e3..90bc4db426 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj @@ -1,32 +1,42 @@ - - - - Exe - net8.0 - - - - - - PreserveNewest - Always - - - - PreserveNewest - Always - - - - - - - - - - - - - - - + + + + Exe + net9.0 + enable + + + + + + PreserveNewest + Always + + + + PreserveNewest + Always + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs index 7cf8c7b3db..aa306d62e9 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs @@ -1,30 +1,30 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Polly; -using Volo.Abp.Autofac; -using Volo.Abp.Http.Client; -using Volo.Abp.Http.Client.IdentityModel; -using Volo.Abp.Modularity; - -namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; - -[DependsOn( - typeof(AbpAutofacModule), - typeof(BookStoreHttpApiClientModule), - typeof(AbpHttpClientIdentityModelModule) - )] -public class BookStoreConsoleApiClientModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - PreConfigure(options => - { - options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) => - { - clientBuilder.AddTransientHttpErrorPolicy( - policyBuilder => policyBuilder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))) - ); - }); - }); - } -} +using System; +using Microsoft.Extensions.DependencyInjection; +using Polly; +using Volo.Abp.Autofac; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.IdentityModel; +using Volo.Abp.Modularity; + +namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(BookStoreHttpApiClientModule), + typeof(AbpHttpClientIdentityModelModule) + )] +public class BookStoreConsoleApiClientModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) => + { + clientBuilder.AddTransientHttpErrorPolicy( + policyBuilder => policyBuilder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))) + ); + }); + }); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs index e4fb3f1acd..94946bfe2c 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs @@ -1,25 +1,38 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.Account; -using Volo.Abp.DependencyInjection; - -namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; - -public class ClientDemoService : ITransientDependency -{ - private readonly IProfileAppService _profileAppService; - - public ClientDemoService(IProfileAppService profileAppService) - { - _profileAppService = profileAppService; - } - - public async Task RunAsync() - { - var output = await _profileAppService.GetAsync(); - Console.WriteLine($"UserName : {output.UserName}"); - Console.WriteLine($"Email : {output.Email}"); - Console.WriteLine($"Name : {output.Name}"); - Console.WriteLine($"Surname : {output.Surname}"); - } -} +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; +using Volo.Abp.Account; + +namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; + +public class ClientDemoService : ITransientDependency +{ + private readonly IProfileAppService _profileAppService; + private readonly IIdentityUserAppService _identityUserAppService; + + public ClientDemoService( + IProfileAppService profileAppService, + IIdentityUserAppService identityUserAppService) + { + _profileAppService = profileAppService; + _identityUserAppService = identityUserAppService; + } + + public async Task RunAsync() + { + var profileDto = await _profileAppService.GetAsync(); + Console.WriteLine($"UserName : {profileDto.UserName}"); + Console.WriteLine($"Email : {profileDto.Email}"); + Console.WriteLine($"Name : {profileDto.Name}"); + Console.WriteLine($"Surname : {profileDto.Surname}"); + Console.WriteLine(); + + var resultDto = await _identityUserAppService.GetListAsync(new GetIdentityUsersInput()); + Console.WriteLine($"Total users: {resultDto.TotalCount}"); + foreach (var identityUserDto in resultDto.Items) + { + Console.WriteLine($"- [{identityUserDto.Id}] {identityUserDto.Name}"); + } + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs deleted file mode 100644 index 54ac083d7c..0000000000 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.Extensions.Hosting; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; - -namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; - -public class ConsoleTestAppHostedService : IHostedService -{ - private readonly IConfiguration _configuration; - - public ConsoleTestAppHostedService(IConfiguration configuration) - { - _configuration = configuration; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - using (var application = await AbpApplicationFactory.CreateAsync(options => - { - options.Services.ReplaceConfiguration(_configuration); - options.UseAutofac(); - })) - { - await application.InitializeAsync(); - - var demo = application.ServiceProvider.GetRequiredService(); - await demo.RunAsync(); - - await application.ShutdownAsync(); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } -} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs index 6b23799bf6..bba65da416 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs @@ -1,22 +1,33 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; - -class Program -{ - static async Task Main(string[] args) - { - await CreateHostBuilder(args).RunConsoleAsync(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureServices((hostContext, services) => - { - services.AddHostedService(); - }); -} +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; + +namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp; + +class Program +{ + static async Task Main(string[] args) + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + var builder = new ConfigurationBuilder(); + builder.AddJsonFile("appsettings.json", false); + builder.AddJsonFile("appsettings.secrets.json", true); + options.Services.ReplaceConfiguration(builder.Build()); + options.UseAutofac(); + })) + { + await application.InitializeAsync(); + + var demo = application.ServiceProvider.GetRequiredService(); + await demo.RunAsync(); + + Console.WriteLine("Press ENTER to stop application..."); + Console.ReadLine(); + + await application.ShutdownAsync(); + } + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json index ea91313f0e..6869bb7b67 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json @@ -1,17 +1,17 @@ -{ - "RemoteServices": { - "Default": { - "BaseUrl": "https://localhost:44313" - } - }, - "IdentityClients": { - "Default": { - "GrantType": "password", - "ClientId": "BookStore_App", - "UserName": "admin", - "UserPassword": "1q2w3E*", - "Authority": "https://localhost:44313", - "Scope": "BookStore" - } - } -} +{ + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44330/" + } + }, + "IdentityClients": { + "Default": { + "GrantType": "password", + "ClientId": "BookStore_App", + "UserName": "admin", + "UserPassword": "1q2w3E*", + "Authority": "https://localhost:44330/", + "Scope": "BookStore" + } + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json index 7a73a41bfd..8f7331c68c 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json @@ -1,2 +1,3 @@ -{ -} \ No newline at end of file +{ + "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgA2ADQAYQA1AGEAZQBmADUALQBhADcAMQA5AC0AYwAxADYAMAAtADYAYQAwAGEALQAzADkAZQBmADEANgAzADYAZgAxAGEAZAA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4ANgA0AGEANQBhAGUAZgA1AC0AYQA3ADEAOQAtAGMAMQA2ADAALQA2AGEAMABhAC0AMwA5AGUAZgAxADYAMwA2AGYAMQBhAGQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBWAG8AbABvAHMAbwBmAHQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBDAHIAZQBhAHQAaQBvAG4AVABpAG0AZQAiAD4AMgAwADIANQAtADEAMAAtADAAMgAgADEAMAA6ADUAMgA6ADAANQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAA8AC8ATABpAGMAZQBuAHMAZQBBAHQAdAByAGkAYgB1AHQAZQBzAD4ACgAgACAAPABTAGkAZwBuAGEAdAB1AHIAZQA+AE0ARQBRAEMASQBFAFAAaABzAFMAdgBoAHQAWABTAHQAcgB6AHEARwA1AEcAMAAzAGkAdwBTAFYARQBzAGoANABPAGYAUwAwAEgAYgBtAC8AOABxAGMATgA4AGcAOQB4AEEAaQBBAFoATgBXAHkARABvADMARgBlADgARgB5AFEAZwA5AFYAWgBsAEcAdAB1ADYAcgAvAEgATQA0AFcAUAA5ADQAQgBKAEgATgB1ADAAZQBHAGIANgBoAFEAPQA9ADwALwBTAGkAZwBuAGEAdAB1AHIAZQA+AAoAPAAvAEwAaQBjAGUAbgBzAGUAPgBNAEYAawB3AEUAdwBZAEgASwBvAFoASQB6AGoAMABDAEEAUQBZAEkASwBvAFoASQB6AGoAMABEAEEAUQBjAEQAUQBnAEEARQA2ACsANgBUAEgAVAByAGkANQBuAHgAaQA0ACsAMAByADMARABQAEYAOABTAG4AdABGAHkAeQBhAFUAMgBXAFEALwAyAG4AUABjADIAZABEAGoAWQBUAFAAcgBSAGMASQBlADAAbwB0AC8AVABEAHcAeABjAEwATgBmADQAUgBmAFcAWgAzAEIAZgBUAGQAVwBvAE8AOQBQAEUAQgAzAHoASwBLAHYAYgAzAHcAPQA9AF8AMQAyADQA" +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.abppkg b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.abppkg new file mode 100644 index 0000000000..d6829692fc --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj index 7a79720e3a..1749ce9c36 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj @@ -1,30 +1,45 @@ - - - - - - net8.0 - Acme.BookStore - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - + + + + + + net9.0 + enable + Acme.BookStore + + + + + + PreserveNewest + true + PreserveNewest + + + + PreserveNewest + Always + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs index c83dbcf404..008a117eda 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs @@ -1,60 +1,67 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.Modularity; -using Volo.Abp.Uow; -using Volo.Abp.Testing; - -namespace Acme.BookStore; - -/* All test classes are derived from this class, directly or indirectly. - */ -public abstract class BookStoreTestBase : AbpIntegratedTest - where TStartupModule : IAbpModule -{ - protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) - { - options.UseAutofac(); - } - - protected virtual Task WithUnitOfWorkAsync(Func func) - { - return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); - } - - protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) - { - using (var scope = ServiceProvider.CreateScope()) - { - var uowManager = scope.ServiceProvider.GetRequiredService(); - - using (var uow = uowManager.Begin(options)) - { - await action(); - - await uow.CompleteAsync(); - } - } - } - - protected virtual Task WithUnitOfWorkAsync(Func> func) - { - return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); - } - - protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) - { - using (var scope = ServiceProvider.CreateScope()) - { - var uowManager = scope.ServiceProvider.GetRequiredService(); - - using (var uow = uowManager.Begin(options)) - { - var result = await func(); - await uow.CompleteAsync(); - return result; - } - } - } -} +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; +using Volo.Abp.Testing; + +namespace Acme.BookStore; + +public abstract class BookStoreTestBase : AbpIntegratedTest + where TStartupModule : IAbpModule +{ + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + protected override void BeforeAddApplication(IServiceCollection services) + { + var builder = new ConfigurationBuilder(); + builder.AddJsonFile("appsettings.json", false); + builder.AddJsonFile("appsettings.secrets.json", true); + services.ReplaceConfiguration(builder.Build()); + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + await action(); + + await uow.CompleteAsync(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = await func(); + await uow.CompleteAsync(); + return result; + } + } + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs index 9d8ffdf6b7..4cfda5181e 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs @@ -1,58 +1,47 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.Authorization; -using Volo.Abp.Autofac; -using Volo.Abp.BackgroundJobs; -using Volo.Abp.Data; -using Volo.Abp.Modularity; -using Volo.Abp.Threading; -using Volo.Abp.Uow; - -namespace Acme.BookStore; - -[DependsOn( - typeof(AbpAutofacModule), - typeof(AbpTestBaseModule), - typeof(AbpAuthorizationModule), - typeof(BookStoreDomainModule) - )] -public class BookStoreTestBaseModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - - } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.IsJobExecutionEnabled = false; - }); - - context.Services.AddAlwaysAllowAuthorization(); - - Configure(options => - { - options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; - }); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - SeedTestData(context); - } - - private static void SeedTestData(ApplicationInitializationContext context) - { - AsyncHelper.RunSync(async () => - { - using (var scope = context.ServiceProvider.CreateScope()) - { - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync(); - } - }); - } -} +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Authorization; +using Volo.Abp.Autofac; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.Data; +using Volo.Abp.Modularity; +using Volo.Abp.Threading; + +namespace Acme.BookStore; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(AbpTestBaseModule), + typeof(AbpAuthorizationModule), + typeof(AbpBackgroundJobsAbstractionsModule) +)] +public class BookStoreTestBaseModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.IsJobExecutionEnabled = false; + }); + + context.Services.AddAlwaysAllowAuthorization(); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + SeedTestData(context); + } + + private static void SeedTestData(ApplicationInitializationContext context) + { + AsyncHelper.RunSync(async () => + { + using (var scope = context.ServiceProvider.CreateScope()) + { + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); + } + }); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestConsts.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestConsts.cs new file mode 100644 index 0000000000..f156be0e44 --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestConsts.cs @@ -0,0 +1,6 @@ +namespace Acme.BookStore; + +public static class BookStoreTestConsts +{ + public const string CollectionDefinitionName = "BookStore collection"; +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataBuilder.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataBuilder.cs new file mode 100644 index 0000000000..622e7dfb8b --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataBuilder.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace Acme.BookStore; + +public class BookStoreTestDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly ICurrentTenant _currentTenant; + + public BookStoreTestDataSeedContributor(ICurrentTenant currentTenant) + { + _currentTenant = currentTenant; + } + + public Task SeedAsync(DataSeedContext context) + { + /* Seed additional test data... */ + + using (_currentTenant.Change(context?.TenantId)) + { + return Task.CompletedTask; + } + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs deleted file mode 100644 index dfd91e219f..0000000000 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; - -namespace Acme.BookStore; - -public class BookStoreTestDataSeedContributor : IDataSeedContributor, ITransientDependency -{ - public Task SeedAsync(DataSeedContext context) - { - /* Seed additional test data... */ - - return Task.CompletedTask; - } -} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Security/FakeCurrentPrincipalAccessor.cs index fa1d626ff2..b19bfac18d 100644 --- a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Security/FakeCurrentPrincipalAccessor.cs +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -1,42 +1,26 @@ -using System.Collections.Generic; -using System.Security.Claims; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Security.Claims; - -namespace Acme.BookStore.Security; - -[Dependency(ReplaceServices = true)] -public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor -{ - protected override ClaimsPrincipal GetClaimsPrincipal() - { - return GetPrincipal(); - } - - private ClaimsPrincipal _principal; - - private ClaimsPrincipal GetPrincipal() - { - if (_principal == null) - { - lock (this) - { - if (_principal == null) - { - _principal = new ClaimsPrincipal( - new ClaimsIdentity( - new List - { - new Claim(AbpClaimTypes.UserId,"2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), - new Claim(AbpClaimTypes.UserName,"admin"), - new Claim(AbpClaimTypes.Email,"admin@abp.io") - } - ) - ); - } - } - } - - return _principal; - } -} +using System; +using System.Collections.Generic; +using System.Security.Claims; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Security.Claims; + +namespace Acme.BookStore.Security; + +[Dependency(ReplaceServices = true)] +public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor +{ + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return GetPrincipal(); + } + + private ClaimsPrincipal GetPrincipal() + { + return new ClaimsPrincipal(new ClaimsIdentity(new List + { + new Claim(AbpClaimTypes.UserId, "2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), + new Claim(AbpClaimTypes.UserName, "admin"), + new Claim(AbpClaimTypes.Email, "admin@abp.io") + })); + } +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.json b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.json new file mode 100644 index 0000000000..5ccf10f258 --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.secrets.json b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.secrets.json new file mode 100644 index 0000000000..556bd0d2fc --- /dev/null +++ b/BookStore-Blazor-EfCore/test/Acme.BookStore.TestBase/appsettings.secrets.json @@ -0,0 +1,3 @@ +{ + "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgA2ADQAYQA1AGEAZQBmADUALQBhADcAMQA5AC0AYwAxADYAMAAtADYAYQAwAGEALQAzADkAZQBmADEANgAzADYAZgAxAGEAZAA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4ANgA0AGEANQBhAGUAZgA1AC0AYQA3ADEAOQAtAGMAMQA2ADAALQA2AGEAMABhAC0AMwA5AGUAZgAxADYAMwA2AGYAMQBhAGQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBWAG8AbABvAHMAbwBmAHQAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBDAHIAZQBhAHQAaQBvAG4AVABpAG0AZQAiAD4AMgAwADIANQAtADEAMAAtADAAMgAgADEAMAA6ADUAMgA6ADAANQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAA8AC8ATABpAGMAZQBuAHMAZQBBAHQAdAByAGkAYgB1AHQAZQBzAD4ACgAgACAAPABTAGkAZwBuAGEAdAB1AHIAZQA+AE0ARQBRAEMASQBFAFAAaABzAFMAdgBoAHQAWABTAHQAcgB6AHEARwA1AEcAMAAzAGkAdwBTAFYARQBzAGoANABPAGYAUwAwAEgAYgBtAC8AOABxAGMATgA4AGcAOQB4AEEAaQBBAFoATgBXAHkARABvADMARgBlADgARgB5AFEAZwA5AFYAWgBsAEcAdAB1ADYAcgAvAEgATQA0AFcAUAA5ADQAQgBKAEgATgB1ADAAZQBHAGIANgBoAFEAPQA9ADwALwBTAGkAZwBuAGEAdAB1AHIAZQA+AAoAPAAvAEwAaQBjAGUAbgBzAGUAPgBNAEYAawB3AEUAdwBZAEgASwBvAFoASQB6AGoAMABDAEEAUQBZAEkASwBvAFoASQB6AGoAMABEAEEAUQBjAEQAUQBnAEEARQA2ACsANgBUAEgAVAByAGkANQBuAHgAaQA0ACsAMAByADMARABQAEYAOABTAG4AdABGAHkAeQBhAFUAMgBXAFEALwAyAG4AUABjADIAZABEAGoAWQBUAFAAcgBSAGMASQBlADAAbwB0AC8AVABEAHcAeABjAEwATgBmADQAUgBmAFcAWgAzAEIAZgBUAGQAVwBvAE8AOQBQAEUAQgAzAHoASwBLAHYAYgAzAHcAPQA9AF8AMQAyADQA" +} \ No newline at end of file
- - -
-
-
-
- -
-
-
- THE OFFICIAL GUIDE -

Mastering ABP Framework

-

Written by the creator of the ABP Framework, this book will help you gain a complete understanding of the framework and modern web application development techniques.

- -
-
-
-
-
- -
-

Let's improve your application!

-

Here are some links to help you get started:

-
- -
-
-
-
-
-
Learn the ABP Framework
-

Explore the compherensive documentation to learn how to build a modern web application.

- See Documents -
-
-
-
-
Samples
-

See the example projects built with the ABP Framework.

- All samples -
-
-
-
-
ABP Community
-

Get involved with a vibrant community and become a contributor.

- Community - Contribute -
-
-
-
-
-
-
ABP Blog
-

Take a look at our recently published articles.

- See Blog -
-
-
-
-
Github
-

Do you love the ABP Framework? Please give a star to support it!

- - See Open Source Framework - -
-
-
-
-
Stackoverflow
-

See answers to previously asked questions or ask a new one.

- Questions - Ask a Question -
-
-
-
-
- -
-

Meet the ABP Commercial

-

A Complete Web Application Platform Built on the ABP Framework

-
- -
-
-

- ABP Commercial is a platform based on the open source ABP framework. It provides pre-built application modules, - rapid application development tooling, professional UI themes, premium support and more. -

- -
-
-
-
- Startup Templates - Details -
-
-
-
-
-
- Application Modules - Details -
-
-
-
-
-
- Developer
Tools - Details -
-
-
-
-
-
- UI
Themes - Details -
-
-
-
-
-
- Premium Support - Details -
-
-
-
-
-
- Additional Services - Details -
-
-
-
-
-
- -