From dc214152e010530e8e25b7ad4e2ff8f52c4b748c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 3 Jun 2019 15:37:42 +0300 Subject: [PATCH] Update BookStore sample with the latest template. --- samples/BookStore/.gitignore | 5 +- samples/BookStore/Acme.BookStore.sln | 69 +- samples/BookStore/common.props | 2 +- ...cme.BookStore.Application.Contracts.csproj | 21 + .../BookDto.cs | 2 - .../BookStoreApplicationContractsModule.cs | 20 + .../CreateUpdateBookDto.cs | 7 +- .../IBookAppService.cs | 0 .../Acme.BookStore.Application.csproj | 6 +- .../BookStoreApplicationAutoMapperProfile.cs | 3 +- .../BookStoreApplicationModule.cs | 5 + .../BookStorePermissionDefinitionProvider.cs | 2 +- .../Permissions/BookStorePermissions.cs | 10 +- .../Acme.BookStore.DbMigrator.csproj | 34 + .../BookStoreDbMigratorModule.cs | 16 + .../src/Acme.BookStore.DbMigrator/Program.cs | 53 ++ .../appsettings.json | 16 + .../Acme.BookStore.Domain.Shared.csproj | 26 + .../BookStoreDomainErrorCodes.cs | 7 + .../BookStoreDomainSharedModule.cs | 45 ++ .../BookType.cs | 4 +- .../Localization/BookStore/cs.json | 8 + .../Localization/BookStore/en.json | 11 +- .../Localization/BookStore/pt-BR.json | 0 .../Localization/BookStore/tr.json | 8 + .../Localization/BookStore/zh-Hans.json | 8 + .../Localization}/BookStoreResource.cs | 2 +- .../MultiTenancy/MultiTenancyConsts.cs | 11 + .../Acme.BookStore.Domain.csproj | 18 +- .../src/Acme.BookStore.Domain/Book.cs | 5 - .../Acme.BookStore.Domain/BookStoreConsts.cs | 2 - .../BookStoreDomainModule.cs | 37 +- .../Data/BookStoreDbMigrationService.cs | 39 ++ .../Data/IBookStoreDbSchemaMigrator.cs | 9 + .../Data/NullBookStoreDbSchemaMigrator.cs | 16 + .../IdentityServerDataSeedContributor.cs | 222 ++++++ .../Localization/BookStore/cs.json | 20 - .../Localization/BookStore/tr.json | 20 - .../Localization/BookStore/zh-Hans.json | 20 - ...re.EntityFrameworkCore.DbMigrations.csproj | 7 +- ...reEntityFrameworkCoreDbMigrationsModule.cs | 16 + .../BookStoreMigrationsDbContext.cs | 9 + .../BookStoreMigrationsDbContextFactory.cs | 2 + ...yFrameworkCoreBookStoreDbSchemaMigrator.cs | 24 + ....cs => 20190603112909_Initial.Designer.cs} | 653 ++++++++++++++++- ...4_Initial.cs => 20190603112909_Initial.cs} | 479 +++++++++++++ ...603113122_Created_Book_Entity.Designer.cs} | 661 +++++++++++++++++- ... => 20190603113122_Created_Book_Entity.cs} | 2 +- ...okStoreMigrationsDbContextModelSnapshot.cs | 634 ++++++++++++++++- .../Acme.BookStore.EntityFrameworkCore.csproj | 5 +- .../EntityFrameworkCore/BookStoreDbContext.cs | 13 + ...okStoreDbContextModelCreatingExtensions.cs | 7 +- .../BookStoreEntityFrameworkCoreModule.cs | 13 +- .../Acme.BookStore.HttpApi.Client.csproj | 21 + .../BookStoreHttpApiClientModule.cs | 29 + .../Acme.BookStore.HttpApi.csproj | 21 + .../BookStoreHttpApiModule.cs | 20 + .../Controllers/BookStoreController.cs | 13 + .../Controllers/TestController.cs | 28 + .../Models/Test/TestModel.cs | 11 + .../Acme.BookStore.Web.csproj | 16 +- .../BookStoreBrandingProvider.cs | 2 +- .../BookStoreWebAutoMapperProfile.cs | 4 +- .../Acme.BookStore.Web/BookStoreWebModule.cs | 91 ++- .../Menus/BookStoreMenuContributor.cs | 12 +- .../Pages/BookStorePageBase.cs | 6 +- .../Pages/BookStorePageModelBase.cs | 4 +- .../Pages/Books/CreateModal.cshtml | 4 +- .../Pages/Books/CreateModal.cshtml.cs | 4 +- .../Pages/Books/EditModal.cshtml | 4 +- .../Pages/Books/EditModal.cshtml.cs | 2 +- .../Pages/Books/Index.cshtml | 23 +- .../Pages/Books/Index.cshtml.cs | 10 +- .../Acme.BookStore.Web/Pages/Books/index.js | 40 +- .../src/Acme.BookStore.Web/Pages/Index.cshtml | 18 +- .../Acme.BookStore.Web/Pages/Index.cshtml.cs | 2 +- .../src/Acme.BookStore.Web/Pages/Index.css | 3 + .../src/Acme.BookStore.Web/Pages/Index.js | 3 + .../src/Acme.BookStore.Web/Program.cs | 8 +- .../Properties/launchSettings.json | 2 +- .../src/Acme.BookStore.Web/Startup.cs | 2 +- .../Views/_ViewImports.cshtml | 1 + .../Acme.BookStore.Web/abp.resourcemapping.js | 2 +- .../appsettings.Development.json | 2 + .../src/Acme.BookStore.Web/appsettings.json | 11 + .../Acme.BookStore.Web/compilerconfig.json | 6 - .../compilerconfig.json.defaults | 49 -- .../src/Acme.BookStore.Web/package.json | 4 +- .../src/Acme.BookStore.Web/tempkey.rsa | 1 + .../wwwroot/pages/index.css | 1 - .../wwwroot/pages/index.min.css | 1 - .../wwwroot/pages/index.scss | 3 - .../Acme.BookStore.Application.Tests.csproj | 13 +- .../BookStoreApplicationTestBase.cs | 11 +- .../BookStoreApplicationTestModule.cs | 69 +- .../Samples/SampleAppServiceTests.cs | 33 + .../Samples/SampleTests.cs | 59 -- .../Acme.BookStore.Domain.Tests.csproj | 18 + .../BookStoreDomainTestBase.cs | 7 + .../BookStoreDomainTestModule.cs | 13 + .../Samples/SampleDomainTests.cs | 45 ++ ...BookStore.EntityFrameworkCore.Tests.csproj | 21 + .../BookStoreEntityFrameworkCoreTestBase.cs | 9 + .../BookStoreEntityFrameworkCoreTestModule.cs | 57 ++ .../Samples/SampleRepositoryTests.cs | 44 ++ ...Store.HttpApi.Client.ConsoleTestApp.csproj | 24 + .../BookStoreConsoleApiClientModule.cs | 14 + .../ClientDemoService.cs | 26 + .../Program.cs | 24 + .../appsettings.json | 18 + .../Acme.BookStore.TestBase.csproj | 26 + .../BookStoreTestBase.cs | 100 +++ .../BookStoreTestBaseModule.cs | 48 ++ .../BookStoreTestDataSeedContributor.cs} | 25 +- .../Acme.BookStore.Web.Tests.csproj | 4 +- .../BookStoreWebTestModule.cs | 16 +- .../Pages/Index_Tests.cs | 16 + .../Samples/SampleWebTest.cs | 23 - 118 files changed, 4003 insertions(+), 578 deletions(-) create mode 100644 samples/BookStore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj rename samples/BookStore/src/{Acme.BookStore.Application => Acme.BookStore.Application.Contracts}/BookDto.cs (84%) create mode 100644 samples/BookStore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs rename samples/BookStore/src/{Acme.BookStore.Application => Acme.BookStore.Application.Contracts}/CreateUpdateBookDto.cs (79%) rename samples/BookStore/src/{Acme.BookStore.Application => Acme.BookStore.Application.Contracts}/IBookAppService.cs (100%) create mode 100644 samples/BookStore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj create mode 100644 samples/BookStore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs create mode 100644 samples/BookStore/src/Acme.BookStore.DbMigrator/Program.cs create mode 100644 samples/BookStore/src/Acme.BookStore.DbMigrator/appsettings.json create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs rename samples/BookStore/src/{Acme.BookStore.Domain => Acme.BookStore.Domain.Shared}/BookType.cs (78%) create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json rename samples/BookStore/src/{Acme.BookStore.Domain => Acme.BookStore.Domain.Shared}/Localization/BookStore/en.json (56%) rename samples/BookStore/src/{Acme.BookStore.Domain => Acme.BookStore.Domain.Shared}/Localization/BookStore/pt-BR.json (100%) create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json rename samples/BookStore/src/{Acme.BookStore.Domain/Localization/BookStore => Acme.BookStore.Domain.Shared/Localization}/BookStoreResource.cs (72%) create mode 100644 samples/BookStore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs create mode 100644 samples/BookStore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs create mode 100644 samples/BookStore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs create mode 100644 samples/BookStore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs create mode 100644 samples/BookStore/src/Acme.BookStore.Domain/IdentityServer/IdentityServerDataSeedContributor.cs delete mode 100644 samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/cs.json delete mode 100644 samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/tr.json delete mode 100644 samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json create mode 100644 samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreEntityFrameworkCoreDbMigrationsModule.cs create mode 100644 samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/{20190416070050_Created_Book_Entity.Designer.cs => 20190603112909_Initial.Designer.cs} (55%) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/{20190402131334_Initial.cs => 20190603112909_Initial.cs} (51%) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/{20190402131334_Initial.Designer.cs => 20190603113122_Created_Book_Entity.Designer.cs} (52%) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/{20190416070050_Created_Book_Entity.cs => 20190603113122_Created_Book_Entity.cs} (95%) create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/TestController.cs create mode 100644 samples/BookStore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs rename samples/BookStore/src/Acme.BookStore.Web/{Branding => }/BookStoreBrandingProvider.cs (89%) create mode 100644 samples/BookStore/src/Acme.BookStore.Web/Pages/Index.css create mode 100644 samples/BookStore/src/Acme.BookStore.Web/Pages/Index.js create mode 100644 samples/BookStore/src/Acme.BookStore.Web/appsettings.Development.json delete mode 100644 samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json delete mode 100644 samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json.defaults create mode 100644 samples/BookStore/src/Acme.BookStore.Web/tempkey.rsa delete mode 100644 samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css delete mode 100644 samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css delete mode 100644 samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss create mode 100644 samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs delete mode 100644 samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs create mode 100644 samples/BookStore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj create mode 100644 samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs create mode 100644 samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs create mode 100644 samples/BookStore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs create mode 100644 samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj create mode 100644 samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs create mode 100644 samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs create mode 100644 samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs create mode 100644 samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj create mode 100644 samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs create mode 100644 samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs create mode 100644 samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs create mode 100644 samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json create mode 100644 samples/BookStore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj create mode 100644 samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs create mode 100644 samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs rename samples/BookStore/test/{Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs => Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs} (61%) create mode 100644 samples/BookStore/test/Acme.BookStore.Web.Tests/Pages/Index_Tests.cs delete mode 100644 samples/BookStore/test/Acme.BookStore.Web.Tests/Samples/SampleWebTest.cs diff --git a/samples/BookStore/.gitignore b/samples/BookStore/.gitignore index 78d93c60d8..5e2a431b54 100644 --- a/samples/BookStore/.gitignore +++ b/samples/BookStore/.gitignore @@ -252,4 +252,7 @@ paket-files/ *.sln.iml # BookStore -src/Acme.BookStore.Web/Logs/logs.txt +src/Acme.BookStore.Web/Logs/* +src/Acme.BookStore.Web.Host/Logs/* +src/Acme.BookStore.IdentityServer/Logs/* +src/Acme.BookStore.HttpApi.Host/Logs/* \ No newline at end of file diff --git a/samples/BookStore/Acme.BookStore.sln b/samples/BookStore/Acme.BookStore.sln index 74836646a2..1de66eeb59 100644 --- a/samples/BookStore/Acme.BookStore.sln +++ b/samples/BookStore/Acme.BookStore.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.1 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28922.388 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 @@ -19,7 +19,25 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Web.Tests", "test\Acme.BookStore.Web.Tests\Acme.BookStore.Web.Tests.csproj", "{5F1B28C6-8D0C-4155-92D0-252F7EA5F674}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Acme.BookStore.EntityFrameworkCore.DbMigrations", "src\Acme.BookStore.EntityFrameworkCore.DbMigrations\Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj", "{0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.EntityFrameworkCore.DbMigrations", "src\Acme.BookStore.EntityFrameworkCore.DbMigrations\Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj", "{0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}" +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 Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -55,6 +73,42 @@ Global {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.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 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -67,6 +121,15 @@ Global {50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} {5F1B28C6-8D0C-4155-92D0-252F7EA5F674} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {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} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} diff --git a/samples/BookStore/common.props b/samples/BookStore/common.props index 771bc6bd29..7585f303ba 100644 --- a/samples/BookStore/common.props +++ b/samples/BookStore/common.props @@ -1,7 +1,7 @@ latest - 0.16.0 + 1.0.0 $(NoWarn);CS1591 \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj b/samples/BookStore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj new file mode 100644 index 0000000000..f08af2efac --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Application.Contracts/Acme.BookStore.Application.Contracts.csproj @@ -0,0 +1,21 @@ + + + + + + netstandard2.0 + Acme.BookStore + + + + + + + + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookDto.cs b/samples/BookStore/src/Acme.BookStore.Application.Contracts/BookDto.cs similarity index 84% rename from samples/BookStore/src/Acme.BookStore.Application/BookDto.cs rename to samples/BookStore/src/Acme.BookStore.Application.Contracts/BookDto.cs index 42581b95fb..5a94fbce1e 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookDto.cs +++ b/samples/BookStore/src/Acme.BookStore.Application.Contracts/BookDto.cs @@ -1,10 +1,8 @@ using System; using Volo.Abp.Application.Dtos; -using Volo.Abp.AutoMapper; namespace Acme.BookStore { - [AutoMapFrom(typeof(Book))] public class BookDto : AuditedEntityDto { public string Name { get; set; } diff --git a/samples/BookStore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs b/samples/BookStore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs new file mode 100644 index 0000000000..f8af658d37 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs @@ -0,0 +1,20 @@ +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.TenantManagement; + +namespace Acme.BookStore +{ + [DependsOn( + typeof(BookStoreDomainSharedModule), + typeof(AbpFeatureManagementApplicationContractsModule), + typeof(AbpIdentityApplicationContractsModule), + typeof(AbpPermissionManagementApplicationContractsModule), + typeof(AbpTenantManagementApplicationContractsModule) + )] + public class BookStoreApplicationContractsModule : AbpModule + { + + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Application/CreateUpdateBookDto.cs b/samples/BookStore/src/Acme.BookStore.Application.Contracts/CreateUpdateBookDto.cs similarity index 79% rename from samples/BookStore/src/Acme.BookStore.Application/CreateUpdateBookDto.cs rename to samples/BookStore/src/Acme.BookStore.Application.Contracts/CreateUpdateBookDto.cs index 0d5dae71cb..8dc38a9e31 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/CreateUpdateBookDto.cs +++ b/samples/BookStore/src/Acme.BookStore.Application.Contracts/CreateUpdateBookDto.cs @@ -1,11 +1,8 @@ using System; using System.ComponentModel.DataAnnotations; -using Volo.Abp.AutoMapper; namespace Acme.BookStore { - [AutoMapTo(typeof(Book))] - [AutoMapFrom(typeof(BookDto))] public class CreateUpdateBookDto { [Required] @@ -14,10 +11,10 @@ namespace Acme.BookStore [Required] public BookType Type { get; set; } = BookType.Undefined; - + [Required] public DateTime PublishDate { get; set; } - + [Required] public float Price { get; set; } } diff --git a/samples/BookStore/src/Acme.BookStore.Application/IBookAppService.cs b/samples/BookStore/src/Acme.BookStore.Application.Contracts/IBookAppService.cs similarity index 100% rename from samples/BookStore/src/Acme.BookStore.Application/IBookAppService.cs rename to samples/BookStore/src/Acme.BookStore.Application.Contracts/IBookAppService.cs diff --git a/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj b/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj index d7983e8b87..4b924ed040 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj +++ b/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj @@ -1,4 +1,4 @@ - + @@ -9,6 +9,10 @@ + + + + diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs index 2d1a44a8c5..9bc08930cf 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationAutoMapperProfile.cs @@ -6,7 +6,8 @@ namespace Acme.BookStore { public BookStoreApplicationAutoMapperProfile() { - //Configure your AutoMapper mapping configuration here... + CreateMap(); + CreateMap(); } } } diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs index 4203ef0ccd..a97917f774 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs @@ -9,6 +9,7 @@ namespace Acme.BookStore { [DependsOn( typeof(BookStoreDomainModule), + typeof(BookStoreApplicationContractsModule), typeof(AbpIdentityApplicationModule), typeof(AbpPermissionManagementApplicationModule), typeof(AbpTenantManagementApplicationModule), @@ -20,6 +21,10 @@ namespace Acme.BookStore { Configure(options => { + /* Use `true` for the `validate` parameter if you want to + * validate the profile on application startup. + * See http://docs.automapper.org/en/stable/Configuration-validation.html for more info + * about the configuration validation. */ options.AddProfile(); }); } diff --git a/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissionDefinitionProvider.cs b/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissionDefinitionProvider.cs index 9a3c6bf18f..aaf784e56e 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissionDefinitionProvider.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissionDefinitionProvider.cs @@ -1,4 +1,4 @@ -using Acme.BookStore.Localization.BookStore; +using Acme.BookStore.Localization; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Localization; diff --git a/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs b/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs index b1ec575904..b05c4883bd 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs @@ -1,6 +1,4 @@ -using System; - -namespace Acme.BookStore.Permissions +namespace Acme.BookStore.Permissions { public static class BookStorePermissions { @@ -8,11 +6,5 @@ namespace Acme.BookStore.Permissions //Add your own permission names. Example: //public const string MyPermission1 = GroupName + ".MyPermission1"; - - public static string[] GetAll() - { - //Return an array of all permissions - return Array.Empty(); - } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj b/samples/BookStore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj new file mode 100644 index 0000000000..7df37ca0a7 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.DbMigrator/Acme.BookStore.DbMigrator.csproj @@ -0,0 +1,34 @@ + + + + + + Exe + netcoreapp2.2 + + + + + + + + + PreserveNewest + Always + + + + + + + + + + + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs b/samples/BookStore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs new file mode 100644 index 0000000000..26b843d34c --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.DbMigrator/BookStoreDbMigratorModule.cs @@ -0,0 +1,16 @@ +using Acme.BookStore.EntityFrameworkCore; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace Acme.BookStore.DbMigrator +{ + [DependsOn( + typeof(AbpAutofacModule), + typeof(BookStoreEntityFrameworkCoreDbMigrationsModule), + typeof(BookStoreApplicationContractsModule) + )] + public class BookStoreDbMigratorModule : AbpModule + { + + } +} diff --git a/samples/BookStore/src/Acme.BookStore.DbMigrator/Program.cs b/samples/BookStore/src/Acme.BookStore.DbMigrator/Program.cs new file mode 100644 index 0000000000..d3c4034c8a --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.DbMigrator/Program.cs @@ -0,0 +1,53 @@ +using System.IO; +using Microsoft.Extensions.DependencyInjection; +using Acme.BookStore.Data; +using Serilog; +using Serilog.Events; +using Volo.Abp; +using Volo.Abp.Threading; + +namespace Acme.BookStore.DbMigrator +{ + class Program + { + static void Main(string[] args) + { + ConfigureLogging(); + + using (var application = AbpApplicationFactory.Create(options => + { + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); + })) + { + application.Initialize(); + + AsyncHelper.RunSync( + () => application + .ServiceProvider + .GetRequiredService() + .MigrateAsync() + ); + + application.Shutdown(); + } + } + + private static void ConfigureLogging() + { + 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.File(Path.Combine(Directory.GetCurrentDirectory(), "Logs/logs.txt")) + .WriteTo.Console() + .CreateLogger(); + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.DbMigrator/appsettings.json b/samples/BookStore/src/Acme.BookStore.DbMigrator/appsettings.json new file mode 100644 index 0000000000..05d7313b10 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.DbMigrator/appsettings.json @@ -0,0 +1,16 @@ +{ + "ConnectionStrings": { + "Default": "Server=localhost;Database=BookStore;Trusted_Connection=True;MultipleActiveResultSets=true" + }, + "IdentityServer": { + "Clients": { + "BookStore_Web": { + "ClientId": "BookStore_Web", + "RootUrl": "https://localhost:44314/" + }, + "BookStore_ConsoleTestApp": { + "ClientId": "BookStore_ConsoleTestApp" + } + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj new file mode 100644 index 0000000000..aba9ffbd3a --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Acme.BookStore.Domain.Shared.csproj @@ -0,0 +1,26 @@ + + + + + + netstandard2.0 + Acme.BookStore + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs b/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs new file mode 100644 index 0000000000..30f124fbed --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs @@ -0,0 +1,7 @@ +namespace Acme.BookStore +{ + public static class BookStoreDomainErrorCodes + { + /* You can add your business exception error codes here, as constants */ + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs b/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs new file mode 100644 index 0000000000..f0a6ad7964 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookStoreDomainSharedModule.cs @@ -0,0 +1,45 @@ +using Acme.BookStore.Localization; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.IdentityServer; +using Volo.Abp.Localization; +using Volo.Abp.Localization.Resources.AbpValidation; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; +using Volo.Abp.VirtualFileSystem; + +namespace Acme.BookStore +{ + [DependsOn( + typeof(AbpAuditLoggingDomainSharedModule), + typeof(BackgroundJobsDomainSharedModule), + typeof(AbpFeatureManagementDomainSharedModule), + typeof(AbpIdentityDomainSharedModule), + typeof(AbpIdentityServerDomainSharedModule), + typeof(AbpPermissionManagementDomainSharedModule), + typeof(AbpSettingManagementDomainSharedModule), + typeof(AbpTenantManagementDomainSharedModule) + )] + public class BookStoreDomainSharedModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded("Acme.BookStore"); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddBaseTypes(typeof(AbpValidationResource)) + .AddVirtualJson("/Localization/BookStore"); + }); + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookType.cs b/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookType.cs similarity index 78% rename from samples/BookStore/src/Acme.BookStore.Domain/BookType.cs rename to samples/BookStore/src/Acme.BookStore.Domain.Shared/BookType.cs index 75d124d915..ba84b4fe2a 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/BookType.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/BookType.cs @@ -1,9 +1,9 @@ namespace Acme.BookStore { - public enum BookType : byte + public enum BookType { Undefined, - Advanture, + Adventure, Biography, Dystopia, Fantastic, diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json new file mode 100644 index 0000000000..619521939c --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/cs.json @@ -0,0 +1,8 @@ +{ + "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." + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/en.json b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json similarity index 56% rename from samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/en.json rename to samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json index 15dcae40ee..c5147cfc64 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/en.json +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json @@ -6,15 +6,6 @@ "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", - "Name": "Name", - "Type": "Type", - "PublishDate": "Publish Date", - "Price": "Price", - "CreationTime": "Creation Time", - "NewBook": "New book", - "Books": "Books", - "Update": "Update", - "BookDeletionConfirmationMessage": "Are you sure to delete this book: {0}", - "SuccessfullyDeleted": "Successfully deleted." + "BookDeletionConfirmationMessage": "Are you sure to delete the book {0}?" } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/pt-BR.json b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pt-BR.json similarity index 100% rename from samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/pt-BR.json rename to samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/pt-BR.json diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json new file mode 100644 index 0000000000..5bf83ee7a8 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/tr.json @@ -0,0 +1,8 @@ +{ + "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." + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json new file mode 100644 index 0000000000..459fc0fefd --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/zh-Hans.json @@ -0,0 +1,8 @@ +{ + "culture": "zh-Hans", + "texts": { + "Menu:Home": "首页", + "Welcome": "欢迎", + "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 cn.abp.io." + } + } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs similarity index 72% rename from samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs rename to samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs index 068968babf..cc4b935e58 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStoreResource.cs @@ -1,6 +1,6 @@ using Volo.Abp.Localization; -namespace Acme.BookStore.Localization.BookStore +namespace Acme.BookStore.Localization { [LocalizationResourceName("BookStore")] public class BookStoreResource diff --git a/samples/BookStore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs b/samples/BookStore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs new file mode 100644 index 0000000000..9ece5cc53e --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs @@ -0,0 +1,11 @@ +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/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj b/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj index 4c0984d3b9..9efa77aa9a 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj +++ b/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj @@ -1,25 +1,27 @@ - + - + netcoreapp2.2 Acme.BookStore + + + + + + + - - - - - - + diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Book.cs b/samples/BookStore/src/Acme.BookStore.Domain/Book.cs index 12984a1896..93dd6d9adc 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Book.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/Book.cs @@ -1,15 +1,10 @@ using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities.Auditing; namespace Acme.BookStore { - [Table("Books")] public class Book : AuditedAggregateRoot { - [Required] - [StringLength(128)] public string Name { get; set; } public BookType Type { get; set; } diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs index 5c8cab1e72..96556e1b85 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs @@ -5,7 +5,5 @@ public const string DbTablePrefix = "App"; public const string DbSchema = null; - - public const bool IsMultiTenancyEnabled = true; } } diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs index 7575b109e2..950bd62d1b 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs @@ -1,48 +1,37 @@ -using Acme.BookStore.Localization.BookStore; -using Volo.Abp.Auditing; +using Acme.BookStore.MultiTenancy; using Volo.Abp.AuditLogging; using Volo.Abp.BackgroundJobs; using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; -using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; +using Volo.Abp.IdentityServer; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.PermissionManagement.IdentityServer; +using Volo.Abp.SettingManagement; using Volo.Abp.TenantManagement; -using Volo.Abp.VirtualFileSystem; namespace Acme.BookStore { [DependsOn( + typeof(BookStoreDomainSharedModule), + typeof(AbpAuditLoggingDomainModule), + typeof(BackgroundJobsDomainModule), + typeof(AbpFeatureManagementDomainModule), typeof(AbpIdentityDomainModule), typeof(AbpPermissionManagementDomainIdentityModule), - typeof(AbpAuditingModule), - typeof(BackgroundJobsDomainModule), - typeof(AbpAuditLoggingDomainModule), - typeof(AbpTenantManagementDomainModule), - typeof(AbpFeatureManagementDomainModule) + typeof(AbpIdentityServerDomainModule), + typeof(AbpPermissionManagementDomainIdentityServerModule), + typeof(AbpSettingManagementDomainModule), + typeof(AbpTenantManagementDomainModule) )] public class BookStoreDomainModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.FileSets.AddEmbedded("Acme.BookStore"); - }); - - Configure(options => - { - options.Resources - .Add("en") - .AddBaseTypes(typeof(AbpValidationResource)) - .AddVirtualJson("/Localization/BookStore"); - }); - Configure(options => { - options.IsEnabled = BookStoreConsts.IsMultiTenancyEnabled; + options.IsEnabled = MultiTenancyConsts.IsEnabled; }); } } diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs b/samples/BookStore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs new file mode 100644 index 0000000000..4db6b4af83 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/Data/BookStoreDbMigrationService.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Acme.BookStore.Data +{ + public class BookStoreDbMigrationService : ITransientDependency + { + public ILogger Logger { get; set; } + + private readonly IDataSeeder _dataSeeder; + private readonly IBookStoreDbSchemaMigrator _dbSchemaMigrator; + + public BookStoreDbMigrationService( + IDataSeeder dataSeeder, + IBookStoreDbSchemaMigrator dbSchemaMigrator) + { + _dataSeeder = dataSeeder; + _dbSchemaMigrator = dbSchemaMigrator; + + Logger = NullLogger.Instance; + } + + public async Task MigrateAsync() + { + Logger.LogInformation("Started database migrations..."); + + Logger.LogInformation("Migrating database schema..."); + await _dbSchemaMigrator.MigrateAsync(); + + Logger.LogInformation("Executing database seed..."); + await _dataSeeder.SeedAsync(); + + Logger.LogInformation("Successfully completed database migrations."); + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs b/samples/BookStore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs new file mode 100644 index 0000000000..5c94a6918e --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/Data/IBookStoreDbSchemaMigrator.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Acme.BookStore.Data +{ + public interface IBookStoreDbSchemaMigrator + { + Task MigrateAsync(); + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs b/samples/BookStore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs new file mode 100644 index 0000000000..f6ed8fc8de --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/Data/NullBookStoreDbSchemaMigrator.cs @@ -0,0 +1,16 @@ +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; + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/samples/BookStore/src/Acme.BookStore.Domain/IdentityServer/IdentityServerDataSeedContributor.cs new file mode 100644 index 0000000000..45c2420501 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Configuration; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.Clients; +using Volo.Abp.IdentityServer.IdentityResources; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; + +namespace Acme.BookStore.IdentityServer +{ + public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency + { + private readonly IApiResourceRepository _apiResourceRepository; + private readonly IClientRepository _clientRepository; + private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; + private readonly IGuidGenerator _guidGenerator; + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IConfigurationAccessor _configurationAccessor; + + public IdentityServerDataSeedContributor( + IClientRepository clientRepository, + IApiResourceRepository apiResourceRepository, + IIdentityResourceDataSeeder identityResourceDataSeeder, + IGuidGenerator guidGenerator, + IPermissionDataSeeder permissionDataSeeder, + IConfigurationAccessor configurationAccessor) + { + _clientRepository = clientRepository; + _apiResourceRepository = apiResourceRepository; + _identityResourceDataSeeder = identityResourceDataSeeder; + _guidGenerator = guidGenerator; + _permissionDataSeeder = permissionDataSeeder; + _configurationAccessor = configurationAccessor; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + await _identityResourceDataSeeder.CreateStandardResourcesAsync(); + await CreateApiResourcesAsync(); + await CreateClientsAsync(); + } + + private async Task CreateApiResourcesAsync() + { + var commonApiUserClaims = new[] + { + "email", + "email_verified", + "name", + "phone_number", + "phone_number_verified", + "role" + }; + + await CreateApiResourceAsync("BookStore", commonApiUserClaims); + } + + private async Task CreateApiResourceAsync(string name, IEnumerable claims) + { + var apiResource = await _apiResourceRepository.FindByNameAsync(name); + if (apiResource == null) + { + apiResource = await _apiResourceRepository.InsertAsync( + new ApiResource( + _guidGenerator.Create(), + name, + name + " API" + ), + autoSave: true + ); + } + + foreach (var claim in claims) + { + if (apiResource.FindClaim(claim) == null) + { + apiResource.AddUserClaim(claim); + } + } + + return await _apiResourceRepository.UpdateAsync(apiResource); + } + + private async Task CreateClientsAsync() + { + const string commonSecret = "E5Xd4yMqjP5kjWFKrYgySBju6JVfCzMyFp7n2QmMrME="; + + var commonScopes = new[] + { + "email", + "openid", + "profile", + "role", + "phone", + "address", + "BookStore" + }; + + var configurationSection = _configurationAccessor.Configuration.GetSection("IdentityServer:Clients"); + + //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 CreateClientAsync( + webClientId, + commonScopes, + new[] { "hybrid" }, + commonSecret, + redirectUri: $"{webClientRootUrl}signin-oidc", + postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc" + ); + } + + //Console Test Client + var consoleClientId = configurationSection["BookStore_ConsoleTestApp:ClientId"]; + if (!consoleClientId.IsNullOrWhiteSpace()) + { + await CreateClientAsync( + consoleClientId, + commonScopes, + new[] { "password", "client_credentials" }, + commonSecret + ); + } + } + + private async Task CreateClientAsync( + string name, + IEnumerable scopes, + IEnumerable grantTypes, + string secret, + string redirectUri = null, + string postLogoutRedirectUri = null, + IEnumerable permissions = null) + { + var client = await _clientRepository.FindByCliendIdAsync(name); + if (client == null) + { + client = await _clientRepository.InsertAsync( + new Client( + _guidGenerator.Create(), + name + ) + { + ClientName = name, + ProtocolType = "oidc", + Description = name, + AlwaysIncludeUserClaimsInIdToken = true, + AllowOfflineAccess = true, + AbsoluteRefreshTokenLifetime = 31536000, //365 days + AccessTokenLifetime = 31536000, //365 days + AuthorizationCodeLifetime = 300, + IdentityTokenLifetime = 300, + RequireConsent = false + }, + autoSave: true + ); + } + + foreach (var scope in scopes) + { + if (client.FindScope(scope) == null) + { + client.AddScope(scope); + } + } + + foreach (var grantType in grantTypes) + { + if (client.FindGrantType(grantType) == null) + { + client.AddGrantType(grantType); + } + } + + if (client.FindSecret(secret) == null) + { + client.AddSecret(secret); + } + + if (redirectUri != null) + { + if (client.FindRedirectUri(redirectUri) == null) + { + client.AddRedirectUri(redirectUri); + } + } + + if (postLogoutRedirectUri != null) + { + if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null) + { + client.AddPostLogoutRedirectUri(postLogoutRedirectUri); + } + } + + if (permissions != null) + { + await _permissionDataSeeder.SeedAsync( + ClientPermissionValueProvider.ProviderName, + name, + permissions + ); + } + + return await _clientRepository.UpdateAsync(client); + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/cs.json b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/cs.json deleted file mode 100644 index 86d19a6aa7..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/cs.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "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.", - "Menu:BookStore": "Knihkupectví", - "Menu:Books": "Knihy", - "Name": "Název", - "Type": "Typ", - "PublishDate": "Publikováno", - "Price": "Cena", - "CreationTime": "Vytvořeno", - "NewBook": "Nová kniha", - "Books": "Knihy", - "Update": "Aktualizovat", - "BookDeletionConfirmationMessage": "Opravdu chcete smazat tuto knihu: {0}", - "SuccessfullyDeleted": "Úspěšně smazáno." - } -} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/tr.json b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/tr.json deleted file mode 100644 index fd17d64b8e..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/tr.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "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.", - "Menu:BookStore": "Kitap Mağazası", - "Menu:Books": "Kitaplar", - "Name": "İsim", - "Type": "Tür", - "PublishDate": "Yayınlanma Tarihi", - "Price": "Fiyat", - "CreationTime": "Oluşturulma zamanı", - "NewBook": "Yeni kitap", - "Books": "Kitaplar", - "Update": "Güncelle", - "BookDeletionConfirmationMessage": "Bu kitabı silmek istediğinize emin misiniz: {0}", - "SuccessfullyDeleted": "Başarıyla silindi." - } -} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json deleted file mode 100644 index be57798695..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "culture": "zh-Hans", - "texts": { - "Menu:Home": "首页", - "Welcome": "欢迎", - "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 cn.abp.io.", - "Menu:BookStore": "图书商店", - "Menu:Books": "图书", - "Name": "名称", - "Type": "类型", - "PublishDate": "出版时间", - "Price": "价格", - "CreationTime": "添加时间", - "NewBook": "新书籍", - "Books": "图书", - "Update": "更新", - "BookDeletionConfirmationMessage": "你确定删除书箱: {0} 吗", - "SuccessfullyDeleted": "删除成功." - } - } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj index d4c691c4e8..3b0318a10c 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj @@ -1,4 +1,4 @@ - + @@ -7,11 +7,6 @@ Acme.BookStore - - - - - diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreEntityFrameworkCoreDbMigrationsModule.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreEntityFrameworkCoreDbMigrationsModule.cs new file mode 100644 index 0000000000..88e21f2ce8 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreEntityFrameworkCoreDbMigrationsModule.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Acme.BookStore.EntityFrameworkCore +{ + [DependsOn( + typeof(BookStoreEntityFrameworkCoreModule) + )] + public class BookStoreEntityFrameworkCoreDbMigrationsModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(); + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs index a43cc52fb6..541a91a0fd 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs @@ -2,14 +2,21 @@ using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.BackgroundJobs.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity; using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.IdentityServer.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.EntityFrameworkCore; namespace Acme.BookStore.EntityFrameworkCore { + /* This DbContext is only used for database migrations. + * It is not used on runtime. See BookStoreDbContext for the runtime DbContext. + * It is a unified model that includes configuration for + * all used modules and your application. + */ public class BookStoreMigrationsDbContext : AbpDbContext { public BookStoreMigrationsDbContext(DbContextOptions options) @@ -29,6 +36,8 @@ namespace Acme.BookStore.EntityFrameworkCore builder.ConfigureBackgroundJobs(); builder.ConfigureAuditLogging(); builder.ConfigureIdentity(); + builder.ConfigureIdentityServer(); + builder.ConfigureFeatureManagement(); builder.ConfigureTenantManagement(); /* Configure customizations for entities from the modules included */ diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs index bc1006d729..da72e6fb21 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs @@ -5,6 +5,8 @@ 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 BookStoreMigrationsDbContextFactory : IDesignTimeDbContextFactory { public BookStoreMigrationsDbContext CreateDbContext(string[] args) diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs new file mode 100644 index 0000000000..954c8f7a13 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/EntityFrameworkCoreBookStoreDbSchemaMigrator.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Acme.BookStore.Data; +using Volo.Abp.DependencyInjection; + +namespace Acme.BookStore.EntityFrameworkCore +{ + [Dependency(ReplaceServices = true)] + public class EntityFrameworkCoreBookStoreDbSchemaMigrator + : IBookStoreDbSchemaMigrator, ITransientDependency + { + private readonly BookStoreMigrationsDbContext _dbContext; + + public EntityFrameworkCoreBookStoreDbSchemaMigrator(BookStoreMigrationsDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task MigrateAsync() + { + await _dbContext.Database.MigrateAsync(); + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603112909_Initial.Designer.cs similarity index 55% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.Designer.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603112909_Initial.Designer.cs index 2ec683d7ed..53187bf54d 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.Designer.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603112909_Initial.Designer.cs @@ -10,50 +10,17 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Acme.BookStore.Migrations { [DbContext(typeof(BookStoreMigrationsDbContext))] - [Migration("20190416070050_Created_Book_Entity")] - partial class Created_Book_Entity + [Migration("20190603112909_Initial")] + partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.3-servicing-35854") + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - modelBuilder.Entity("Acme.BookStore.Book", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp"); - - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime"); - - b.Property("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("Price"); - - b.Property("PublishDate"); - - b.Property("Type"); - - b.HasKey("Id"); - - b.ToTable("AppBooks"); - }); - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { b.Property("Id") @@ -298,6 +265,32 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpBackgroundJobs"); }); + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -596,6 +589,482 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpUserTokens"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasMaxLength(200); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiResources"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.Property("ApiResourceId"); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("ApiResourceId", "Type"); + + b.ToTable("IdentityServerApiClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.Property("ApiResourceId"); + + b.Property("Name") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("DisplayName") + .HasMaxLength(128); + + b.Property("Emphasize"); + + b.Property("Required"); + + b.Property("ShowInDiscoveryDocument"); + + b.HasKey("ApiResourceId", "Name"); + + b.ToTable("IdentityServerApiScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.Property("ApiResourceId"); + + b.Property("Name") + .HasMaxLength(196); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("ApiResourceId", "Name", "Type"); + + b.ToTable("IdentityServerApiScopeClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.Property("ApiResourceId"); + + b.Property("Type") + .HasMaxLength(32); + + b.Property("Value") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("Expiration"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AbsoluteRefreshTokenLifetime"); + + b.Property("AccessTokenLifetime"); + + b.Property("AccessTokenType"); + + b.Property("AllowAccessTokensViaBrowser"); + + b.Property("AllowOfflineAccess"); + + b.Property("AllowPlainTextPkce"); + + b.Property("AllowRememberConsent"); + + b.Property("AlwaysIncludeUserClaimsInIdToken"); + + b.Property("AlwaysSendClientClaims"); + + b.Property("AuthorizationCodeLifetime"); + + b.Property("BackChannelLogoutSessionRequired"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(300); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200); + + b.Property("ClientName") + .HasMaxLength(200); + + b.Property("ClientUri") + .HasMaxLength(300); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentLifetime"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("EnableLocalLogin"); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutSessionRequired"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(300); + + b.Property("IdentityTokenLifetime"); + + b.Property("IncludeJwtId"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasMaxLength(300); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200); + + b.Property("RefreshTokenExpiration"); + + b.Property("RefreshTokenUsage"); + + b.Property("RequireClientSecret"); + + b.Property("RequireConsent"); + + b.Property("RequirePkce"); + + b.Property("SlidingRefreshTokenLifetime"); + + b.Property("UpdateAccessTokenClaimsOnRefresh"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique(); + + b.ToTable("IdentityServerClients"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.Property("ClientId"); + + b.Property("Type") + .HasMaxLength(250); + + b.Property("Value") + .HasMaxLength(250); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.Property("ClientId"); + + b.Property("Origin") + .HasMaxLength(150); + + b.HasKey("ClientId", "Origin"); + + b.ToTable("IdentityServerClientCorsOrigins"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.Property("ClientId"); + + b.Property("GrantType") + .HasMaxLength(196); + + b.HasKey("ClientId", "GrantType"); + + b.ToTable("IdentityServerClientGrantTypes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.Property("ClientId"); + + b.Property("Provider") + .HasMaxLength(64); + + b.HasKey("ClientId", "Provider"); + + b.ToTable("IdentityServerClientIdPRestrictions"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.Property("ClientId"); + + b.Property("PostLogoutRedirectUri") + .HasMaxLength(200); + + b.HasKey("ClientId", "PostLogoutRedirectUri"); + + b.ToTable("IdentityServerClientPostLogoutRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.Property("ClientId"); + + b.Property("Key") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128); + + b.HasKey("ClientId", "Key"); + + b.ToTable("IdentityServerClientProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.Property("ClientId"); + + b.Property("RedirectUri") + .HasMaxLength(200); + + b.HasKey("ClientId", "RedirectUri"); + + b.ToTable("IdentityServerClientRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.Property("ClientId"); + + b.Property("Scope") + .HasMaxLength(196); + + b.HasKey("ClientId", "Scope"); + + b.ToTable("IdentityServerClientScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.Property("ClientId"); + + b.Property("Type") + .HasMaxLength(32); + + b.Property("Value") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("Expiration"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200); + + b.Property("ConcurrencyStamp"); + + b.Property("CreationTime"); + + b.Property("Data") + .IsRequired(); + + b.Property("Expiration"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("Id"); + + b.Property("SubjectId") + .HasMaxLength(200); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50); + + b.HasKey("Key"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.ToTable("IdentityServerPersistedGrants"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.Property("IdentityResourceId"); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasMaxLength(200); + + b.Property("Emphasize"); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200); + + b.Property("Required"); + + b.Property("ShowInDiscoveryDocument"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerIdentityResources"); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -780,6 +1249,118 @@ namespace Acme.BookStore.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId", "Name") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource") + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => { b.HasOne("Volo.Abp.TenantManagement.Tenant") diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603112909_Initial.cs similarity index 51% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603112909_Initial.cs index fb85c4cc6d..45cd778b73 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603112909_Initial.cs @@ -80,6 +80,21 @@ namespace Acme.BookStore.Migrations table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(nullable: false), + Name = table.Column(maxLength: 128, nullable: false), + Value = table.Column(maxLength: 128, nullable: false), + ProviderName = table.Column(maxLength: 64, nullable: true), + ProviderKey = table.Column(maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpPermissionGrants", columns: table => new @@ -186,6 +201,131 @@ namespace Acme.BookStore.Migrations table.PrimaryKey("PK_AbpUsers", x => x.Id); }); + migrationBuilder.CreateTable( + name: "IdentityServerApiResources", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), + Name = table.Column(maxLength: 200, nullable: false), + DisplayName = table.Column(maxLength: 200, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), + Enabled = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResources", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClients", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), + ClientId = table.Column(maxLength: 200, nullable: false), + ClientName = table.Column(maxLength: 200, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), + ClientUri = table.Column(maxLength: 300, nullable: true), + LogoUri = table.Column(maxLength: 300, nullable: true), + Enabled = table.Column(nullable: false), + ProtocolType = table.Column(maxLength: 200, nullable: false), + RequireClientSecret = table.Column(nullable: false), + RequireConsent = table.Column(nullable: false), + AllowRememberConsent = table.Column(nullable: false), + AlwaysIncludeUserClaimsInIdToken = table.Column(nullable: false), + RequirePkce = table.Column(nullable: false), + AllowPlainTextPkce = table.Column(nullable: false), + AllowAccessTokensViaBrowser = table.Column(nullable: false), + FrontChannelLogoutUri = table.Column(maxLength: 300, nullable: true), + FrontChannelLogoutSessionRequired = table.Column(nullable: false), + BackChannelLogoutUri = table.Column(maxLength: 300, nullable: true), + BackChannelLogoutSessionRequired = table.Column(nullable: false), + AllowOfflineAccess = table.Column(nullable: false), + IdentityTokenLifetime = table.Column(nullable: false), + AccessTokenLifetime = table.Column(nullable: false), + AuthorizationCodeLifetime = table.Column(nullable: false), + ConsentLifetime = table.Column(nullable: true), + AbsoluteRefreshTokenLifetime = table.Column(nullable: false), + SlidingRefreshTokenLifetime = table.Column(nullable: false), + RefreshTokenUsage = table.Column(nullable: false), + UpdateAccessTokenClaimsOnRefresh = table.Column(nullable: false), + RefreshTokenExpiration = table.Column(nullable: false), + AccessTokenType = table.Column(nullable: false), + EnableLocalLogin = table.Column(nullable: false), + IncludeJwtId = table.Column(nullable: false), + AlwaysSendClientClaims = table.Column(nullable: false), + ClientClaimsPrefix = table.Column(maxLength: 200, nullable: true), + PairWiseSubjectSalt = table.Column(maxLength: 200, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClients", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerIdentityResources", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), + Name = table.Column(maxLength: 200, nullable: false), + DisplayName = table.Column(maxLength: 200, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), + Enabled = table.Column(nullable: false), + Required = table.Column(nullable: false), + Emphasize = table.Column(nullable: false), + ShowInDiscoveryDocument = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerIdentityResources", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerPersistedGrants", + columns: table => new + { + Key = table.Column(maxLength: 200, nullable: false), + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + Type = table.Column(maxLength: 50, nullable: false), + SubjectId = table.Column(maxLength: 200, nullable: true), + ClientId = table.Column(maxLength: 200, nullable: false), + CreationTime = table.Column(nullable: false), + Expiration = table.Column(nullable: true), + Data = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerPersistedGrants", x => x.Key); + }); + migrationBuilder.CreateTable( name: "AbpAuditLogActions", columns: table => new @@ -364,6 +504,253 @@ namespace Acme.BookStore.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "IdentityServerApiClaims", + columns: table => new + { + Type = table.Column(maxLength: 196, nullable: false), + ApiResourceId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiClaims", x => new { x.ApiResourceId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerApiClaims_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiScopes", + columns: table => new + { + ApiResourceId = table.Column(nullable: false), + Name = table.Column(maxLength: 196, nullable: false), + DisplayName = table.Column(maxLength: 128, nullable: true), + Description = table.Column(maxLength: 256, nullable: true), + Required = table.Column(nullable: false), + Emphasize = table.Column(nullable: false), + ShowInDiscoveryDocument = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopes", x => new { x.ApiResourceId, x.Name }); + table.ForeignKey( + name: "FK_IdentityServerApiScopes_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiSecrets", + columns: table => new + { + Type = table.Column(maxLength: 32, nullable: false), + Value = table.Column(maxLength: 196, nullable: false), + ApiResourceId = table.Column(nullable: false), + Description = table.Column(maxLength: 256, nullable: true), + Expiration = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerApiSecrets_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientClaims", + columns: table => new + { + ClientId = table.Column(nullable: false), + Type = table.Column(maxLength: 250, nullable: false), + Value = table.Column(maxLength: 250, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientClaims", x => new { x.ClientId, x.Type, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerClientClaims_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientCorsOrigins", + columns: table => new + { + ClientId = table.Column(nullable: false), + Origin = table.Column(maxLength: 150, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientCorsOrigins", x => new { x.ClientId, x.Origin }); + table.ForeignKey( + name: "FK_IdentityServerClientCorsOrigins_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientGrantTypes", + columns: table => new + { + ClientId = table.Column(nullable: false), + GrantType = table.Column(maxLength: 196, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientGrantTypes", x => new { x.ClientId, x.GrantType }); + table.ForeignKey( + name: "FK_IdentityServerClientGrantTypes_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientIdPRestrictions", + columns: table => new + { + ClientId = table.Column(nullable: false), + Provider = table.Column(maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientIdPRestrictions", x => new { x.ClientId, x.Provider }); + table.ForeignKey( + name: "FK_IdentityServerClientIdPRestrictions_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientPostLogoutRedirectUris", + columns: table => new + { + ClientId = table.Column(nullable: false), + PostLogoutRedirectUri = table.Column(maxLength: 200, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientPostLogoutRedirectUris", x => new { x.ClientId, x.PostLogoutRedirectUri }); + table.ForeignKey( + name: "FK_IdentityServerClientPostLogoutRedirectUris_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientProperties", + columns: table => new + { + ClientId = table.Column(nullable: false), + Key = table.Column(maxLength: 64, nullable: false), + Value = table.Column(maxLength: 128, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key }); + table.ForeignKey( + name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientRedirectUris", + columns: table => new + { + ClientId = table.Column(nullable: false), + RedirectUri = table.Column(maxLength: 200, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientRedirectUris", x => new { x.ClientId, x.RedirectUri }); + table.ForeignKey( + name: "FK_IdentityServerClientRedirectUris_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientScopes", + columns: table => new + { + ClientId = table.Column(nullable: false), + Scope = table.Column(maxLength: 196, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientScopes", x => new { x.ClientId, x.Scope }); + table.ForeignKey( + name: "FK_IdentityServerClientScopes_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientSecrets", + columns: table => new + { + Type = table.Column(maxLength: 32, nullable: false), + Value = table.Column(maxLength: 196, nullable: false), + ClientId = table.Column(nullable: false), + Description = table.Column(maxLength: 256, nullable: true), + Expiration = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientSecrets", x => new { x.ClientId, x.Type, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerClientSecrets_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerIdentityClaims", + columns: table => new + { + Type = table.Column(maxLength: 196, nullable: false), + IdentityResourceId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerIdentityClaims", x => new { x.IdentityResourceId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerIdentityClaims_IdentityServerIdentityResources_IdentityResourceId", + column: x => x.IdentityResourceId, + principalTable: "IdentityServerIdentityResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpEntityPropertyChanges", columns: table => new @@ -387,6 +774,25 @@ namespace Acme.BookStore.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "IdentityServerApiScopeClaims", + columns: table => new + { + Type = table.Column(maxLength: 196, nullable: false), + ApiResourceId = table.Column(nullable: false), + Name = table.Column(maxLength: 196, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiResourceId, x.Name, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiResourceId_Name", + columns: x => new { x.ApiResourceId, x.Name }, + principalTable: "IdentityServerApiScopes", + principalColumns: new[] { "ApiResourceId", "Name" }, + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateIndex( name: "IX_AbpAuditLogActions_AuditLogId", table: "AbpAuditLogActions", @@ -427,6 +833,11 @@ namespace Acme.BookStore.Migrations table: "AbpEntityPropertyChanges", column: "EntityChangeId"); + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + migrationBuilder.CreateIndex( name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", table: "AbpPermissionGrants", @@ -487,6 +898,17 @@ namespace Acme.BookStore.Migrations name: "IX_AbpUsers_UserName", table: "AbpUsers", column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerClients_ClientId", + table: "IdentityServerClients", + column: "ClientId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", + table: "IdentityServerPersistedGrants", + columns: new[] { "SubjectId", "ClientId", "Type" }); } protected override void Down(MigrationBuilder migrationBuilder) @@ -503,6 +925,9 @@ namespace Acme.BookStore.Migrations migrationBuilder.DropTable( name: "AbpEntityPropertyChanges"); + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + migrationBuilder.DropTable( name: "AbpPermissionGrants"); @@ -527,6 +952,48 @@ namespace Acme.BookStore.Migrations migrationBuilder.DropTable( name: "AbpUserTokens"); + migrationBuilder.DropTable( + name: "IdentityServerApiClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerApiScopeClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerApiSecrets"); + + migrationBuilder.DropTable( + name: "IdentityServerClientClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerClientCorsOrigins"); + + migrationBuilder.DropTable( + name: "IdentityServerClientGrantTypes"); + + migrationBuilder.DropTable( + name: "IdentityServerClientIdPRestrictions"); + + migrationBuilder.DropTable( + name: "IdentityServerClientPostLogoutRedirectUris"); + + migrationBuilder.DropTable( + name: "IdentityServerClientProperties"); + + migrationBuilder.DropTable( + name: "IdentityServerClientRedirectUris"); + + migrationBuilder.DropTable( + name: "IdentityServerClientScopes"); + + migrationBuilder.DropTable( + name: "IdentityServerClientSecrets"); + + migrationBuilder.DropTable( + name: "IdentityServerIdentityClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerPersistedGrants"); + migrationBuilder.DropTable( name: "AbpEntityChanges"); @@ -539,8 +1006,20 @@ namespace Acme.BookStore.Migrations migrationBuilder.DropTable( name: "AbpUsers"); + migrationBuilder.DropTable( + name: "IdentityServerApiScopes"); + + migrationBuilder.DropTable( + name: "IdentityServerClients"); + + migrationBuilder.DropTable( + name: "IdentityServerIdentityResources"); + migrationBuilder.DropTable( name: "AbpAuditLogs"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResources"); } } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603113122_Created_Book_Entity.Designer.cs similarity index 52% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.Designer.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603113122_Created_Book_Entity.Designer.cs index 37937a0bb6..de5a467a66 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.Designer.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603113122_Created_Book_Entity.Designer.cs @@ -1,26 +1,65 @@ // 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 Acme.BookStore.EntityFrameworkCore; namespace Acme.BookStore.Migrations { [DbContext(typeof(BookStoreMigrationsDbContext))] - [Migration("20190402131334_Initial")] - partial class Initial + [Migration("20190603113122_Created_Book_Entity")] + partial class Created_Book_Entity { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Acme.BookStore.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("Price"); + + b.Property("PublishDate"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("AppBooks"); + }); + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { b.Property("Id") @@ -265,6 +304,32 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpBackgroundJobs"); }); + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -563,6 +628,482 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpUserTokens"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasMaxLength(200); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiResources"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.Property("ApiResourceId"); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("ApiResourceId", "Type"); + + b.ToTable("IdentityServerApiClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.Property("ApiResourceId"); + + b.Property("Name") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("DisplayName") + .HasMaxLength(128); + + b.Property("Emphasize"); + + b.Property("Required"); + + b.Property("ShowInDiscoveryDocument"); + + b.HasKey("ApiResourceId", "Name"); + + b.ToTable("IdentityServerApiScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.Property("ApiResourceId"); + + b.Property("Name") + .HasMaxLength(196); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("ApiResourceId", "Name", "Type"); + + b.ToTable("IdentityServerApiScopeClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.Property("ApiResourceId"); + + b.Property("Type") + .HasMaxLength(32); + + b.Property("Value") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("Expiration"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AbsoluteRefreshTokenLifetime"); + + b.Property("AccessTokenLifetime"); + + b.Property("AccessTokenType"); + + b.Property("AllowAccessTokensViaBrowser"); + + b.Property("AllowOfflineAccess"); + + b.Property("AllowPlainTextPkce"); + + b.Property("AllowRememberConsent"); + + b.Property("AlwaysIncludeUserClaimsInIdToken"); + + b.Property("AlwaysSendClientClaims"); + + b.Property("AuthorizationCodeLifetime"); + + b.Property("BackChannelLogoutSessionRequired"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(300); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200); + + b.Property("ClientName") + .HasMaxLength(200); + + b.Property("ClientUri") + .HasMaxLength(300); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentLifetime"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("EnableLocalLogin"); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutSessionRequired"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(300); + + b.Property("IdentityTokenLifetime"); + + b.Property("IncludeJwtId"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasMaxLength(300); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200); + + b.Property("RefreshTokenExpiration"); + + b.Property("RefreshTokenUsage"); + + b.Property("RequireClientSecret"); + + b.Property("RequireConsent"); + + b.Property("RequirePkce"); + + b.Property("SlidingRefreshTokenLifetime"); + + b.Property("UpdateAccessTokenClaimsOnRefresh"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique(); + + b.ToTable("IdentityServerClients"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.Property("ClientId"); + + b.Property("Type") + .HasMaxLength(250); + + b.Property("Value") + .HasMaxLength(250); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.Property("ClientId"); + + b.Property("Origin") + .HasMaxLength(150); + + b.HasKey("ClientId", "Origin"); + + b.ToTable("IdentityServerClientCorsOrigins"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.Property("ClientId"); + + b.Property("GrantType") + .HasMaxLength(196); + + b.HasKey("ClientId", "GrantType"); + + b.ToTable("IdentityServerClientGrantTypes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.Property("ClientId"); + + b.Property("Provider") + .HasMaxLength(64); + + b.HasKey("ClientId", "Provider"); + + b.ToTable("IdentityServerClientIdPRestrictions"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.Property("ClientId"); + + b.Property("PostLogoutRedirectUri") + .HasMaxLength(200); + + b.HasKey("ClientId", "PostLogoutRedirectUri"); + + b.ToTable("IdentityServerClientPostLogoutRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.Property("ClientId"); + + b.Property("Key") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128); + + b.HasKey("ClientId", "Key"); + + b.ToTable("IdentityServerClientProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.Property("ClientId"); + + b.Property("RedirectUri") + .HasMaxLength(200); + + b.HasKey("ClientId", "RedirectUri"); + + b.ToTable("IdentityServerClientRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.Property("ClientId"); + + b.Property("Scope") + .HasMaxLength(196); + + b.HasKey("ClientId", "Scope"); + + b.ToTable("IdentityServerClientScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.Property("ClientId"); + + b.Property("Type") + .HasMaxLength(32); + + b.Property("Value") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("Expiration"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200); + + b.Property("ConcurrencyStamp"); + + b.Property("CreationTime"); + + b.Property("Data") + .IsRequired(); + + b.Property("Expiration"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("Id"); + + b.Property("SubjectId") + .HasMaxLength(200); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50); + + b.HasKey("Key"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.ToTable("IdentityServerPersistedGrants"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.Property("IdentityResourceId"); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasMaxLength(200); + + b.Property("Emphasize"); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200); + + b.Property("Required"); + + b.Property("ShowInDiscoveryDocument"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerIdentityResources"); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -747,6 +1288,118 @@ namespace Acme.BookStore.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId", "Name") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource") + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => { b.HasOne("Volo.Abp.TenantManagement.Tenant") diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603113122_Created_Book_Entity.cs similarity index 95% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603113122_Created_Book_Entity.cs index f4e67242e3..a1aef5d9da 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190603113122_Created_Book_Entity.cs @@ -19,7 +19,7 @@ namespace Acme.BookStore.Migrations LastModificationTime = table.Column(nullable: true), LastModifierId = table.Column(nullable: true), Name = table.Column(maxLength: 128, nullable: false), - Type = table.Column(nullable: false), + Type = table.Column(nullable: false), PublishDate = table.Column(nullable: false), Price = table.Column(nullable: false) }, diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs index fcd623b85e..80e730e081 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs @@ -15,7 +15,7 @@ namespace Acme.BookStore.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.3-servicing-35854") + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -24,18 +24,24 @@ namespace Acme.BookStore.Migrations b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("ConcurrencyStamp"); + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); - b.Property("CreationTime"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); - b.Property("CreatorId"); + b.Property("CreatorId") + .HasColumnName("CreatorId"); b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); - b.Property("LastModificationTime"); + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); - b.Property("LastModifierId"); + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() @@ -45,7 +51,7 @@ namespace Acme.BookStore.Migrations b.Property("PublishDate"); - b.Property("Type"); + b.Property("Type"); b.HasKey("Id"); @@ -296,6 +302,32 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpBackgroundJobs"); }); + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -594,6 +626,482 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpUserTokens"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasMaxLength(200); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiResources"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.Property("ApiResourceId"); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("ApiResourceId", "Type"); + + b.ToTable("IdentityServerApiClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.Property("ApiResourceId"); + + b.Property("Name") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("DisplayName") + .HasMaxLength(128); + + b.Property("Emphasize"); + + b.Property("Required"); + + b.Property("ShowInDiscoveryDocument"); + + b.HasKey("ApiResourceId", "Name"); + + b.ToTable("IdentityServerApiScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.Property("ApiResourceId"); + + b.Property("Name") + .HasMaxLength(196); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("ApiResourceId", "Name", "Type"); + + b.ToTable("IdentityServerApiScopeClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.Property("ApiResourceId"); + + b.Property("Type") + .HasMaxLength(32); + + b.Property("Value") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("Expiration"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AbsoluteRefreshTokenLifetime"); + + b.Property("AccessTokenLifetime"); + + b.Property("AccessTokenType"); + + b.Property("AllowAccessTokensViaBrowser"); + + b.Property("AllowOfflineAccess"); + + b.Property("AllowPlainTextPkce"); + + b.Property("AllowRememberConsent"); + + b.Property("AlwaysIncludeUserClaimsInIdToken"); + + b.Property("AlwaysSendClientClaims"); + + b.Property("AuthorizationCodeLifetime"); + + b.Property("BackChannelLogoutSessionRequired"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(300); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200); + + b.Property("ClientName") + .HasMaxLength(200); + + b.Property("ClientUri") + .HasMaxLength(300); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentLifetime"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("EnableLocalLogin"); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutSessionRequired"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(300); + + b.Property("IdentityTokenLifetime"); + + b.Property("IncludeJwtId"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasMaxLength(300); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200); + + b.Property("RefreshTokenExpiration"); + + b.Property("RefreshTokenUsage"); + + b.Property("RequireClientSecret"); + + b.Property("RequireConsent"); + + b.Property("RequirePkce"); + + b.Property("SlidingRefreshTokenLifetime"); + + b.Property("UpdateAccessTokenClaimsOnRefresh"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique(); + + b.ToTable("IdentityServerClients"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.Property("ClientId"); + + b.Property("Type") + .HasMaxLength(250); + + b.Property("Value") + .HasMaxLength(250); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.Property("ClientId"); + + b.Property("Origin") + .HasMaxLength(150); + + b.HasKey("ClientId", "Origin"); + + b.ToTable("IdentityServerClientCorsOrigins"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.Property("ClientId"); + + b.Property("GrantType") + .HasMaxLength(196); + + b.HasKey("ClientId", "GrantType"); + + b.ToTable("IdentityServerClientGrantTypes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.Property("ClientId"); + + b.Property("Provider") + .HasMaxLength(64); + + b.HasKey("ClientId", "Provider"); + + b.ToTable("IdentityServerClientIdPRestrictions"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.Property("ClientId"); + + b.Property("PostLogoutRedirectUri") + .HasMaxLength(200); + + b.HasKey("ClientId", "PostLogoutRedirectUri"); + + b.ToTable("IdentityServerClientPostLogoutRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.Property("ClientId"); + + b.Property("Key") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128); + + b.HasKey("ClientId", "Key"); + + b.ToTable("IdentityServerClientProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.Property("ClientId"); + + b.Property("RedirectUri") + .HasMaxLength(200); + + b.HasKey("ClientId", "RedirectUri"); + + b.ToTable("IdentityServerClientRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.Property("ClientId"); + + b.Property("Scope") + .HasMaxLength(196); + + b.HasKey("ClientId", "Scope"); + + b.ToTable("IdentityServerClientScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.Property("ClientId"); + + b.Property("Type") + .HasMaxLength(32); + + b.Property("Value") + .HasMaxLength(196); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("Expiration"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200); + + b.Property("ConcurrencyStamp"); + + b.Property("CreationTime"); + + b.Property("Data") + .IsRequired(); + + b.Property("Expiration"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("Id"); + + b.Property("SubjectId") + .HasMaxLength(200); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50); + + b.HasKey("Key"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.ToTable("IdentityServerPersistedGrants"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.Property("IdentityResourceId"); + + b.Property("Type") + .HasMaxLength(196); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasMaxLength(200); + + b.Property("Emphasize"); + + b.Property("Enabled"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200); + + b.Property("Required"); + + b.Property("ShowInDiscoveryDocument"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerIdentityResources"); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -778,6 +1286,118 @@ namespace Acme.BookStore.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope") + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId", "Name") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource") + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client") + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource") + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => { b.HasOne("Volo.Abp.TenantManagement.Tenant") diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj index e65e2d5d89..967187059a 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj @@ -1,4 +1,4 @@ - + @@ -9,14 +9,15 @@ + + - diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs index 1aebc9b1ae..386eb2623b 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs @@ -7,6 +7,15 @@ using Volo.Abp.Users.EntityFrameworkCore; namespace Acme.BookStore.EntityFrameworkCore { + /* This is your actual DbContext used on runtime. + * It includes only your entities. + * It does not include entities of the used modules, because each module has already + * its own DbContext class. If you want to share some database tables with the used modules, + * just create a structure like done for AppUser. + * + * Don't use this DbContext for database migrations since it does not contain tables of the + * used modules (as explained above). See BookStoreMigrationsDbContext for migrations. + */ [ConnectionStringName("Default")] public class BookStoreDbContext : AbpDbContext { @@ -14,6 +23,10 @@ namespace Acme.BookStore.EntityFrameworkCore public DbSet Books { get; set; } + /* Add DbSet properties for your Aggregate Roots / Entities here. + * Also map them inside BookStoreDbContextModelCreatingExtensions.ConfigureBookStore + */ + public BookStoreDbContext(DbContextOptions options) : base(options) { diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs index b7cdd8705d..d14e33208d 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Volo.Abp; -using Volo.Abp.Users; using Volo.Abp.EntityFrameworkCore.Modeling; +using Volo.Abp.Users; namespace Acme.BookStore.EntityFrameworkCore { @@ -17,7 +17,12 @@ namespace Acme.BookStore.EntityFrameworkCore builder.Entity(b => { b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); + + b.ConfigureAudited(); b.ConfigureExtraProperties(); + b.ConfigureConcurrencyStamp(); + + b.Property(x => x.Name).IsRequired().HasMaxLength(128); }); } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs index a8e4d2de0c..efa5642632 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs @@ -1,9 +1,11 @@ using Microsoft.Extensions.DependencyInjection; 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.IdentityServer.EntityFrameworkCore; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; @@ -14,6 +16,7 @@ namespace Acme.BookStore.EntityFrameworkCore [DependsOn( typeof(BookStoreDomainModule), typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpIdentityServerEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpSettingManagementEntityFrameworkCoreModule), typeof(AbpEntityFrameworkCoreSqlServerModule), @@ -28,9 +31,17 @@ namespace Acme.BookStore.EntityFrameworkCore { context.Services.AddAbpDbContext(options => { - //Remove "includeAllEntities: true" to create default repositories only for aggregate roots + /* 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(); + }); } } } diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj b/samples/BookStore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj new file mode 100644 index 0000000000..fd3ba12fe7 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi.Client/Acme.BookStore.HttpApi.Client.csproj @@ -0,0 +1,21 @@ + + + + + + netstandard2.0 + Acme.BookStore + + + + + + + + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs b/samples/BookStore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs new file mode 100644 index 0000000000..0139522107 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi.Client/BookStoreHttpApiClientModule.cs @@ -0,0 +1,29 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.TenantManagement; + +namespace Acme.BookStore +{ + [DependsOn( + typeof(BookStoreApplicationContractsModule), + typeof(AbpIdentityHttpApiClientModule), + typeof(AbpPermissionManagementHttpApiClientModule), + typeof(AbpTenantManagementHttpApiClientModule), + typeof(AbpFeatureManagementHttpApiClientModule) + )] + public class BookStoreHttpApiClientModule : AbpModule + { + public const string RemoteServiceName = "Default"; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpClientProxies( + typeof(BookStoreApplicationContractsModule).Assembly, + RemoteServiceName + ); + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj b/samples/BookStore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj new file mode 100644 index 0000000000..7f819c039b --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi/Acme.BookStore.HttpApi.csproj @@ -0,0 +1,21 @@ + + + + + + netcoreapp2.2 + Acme.BookStore + + + + + + + + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs b/samples/BookStore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs new file mode 100644 index 0000000000..2f990bfe56 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi/BookStoreHttpApiModule.cs @@ -0,0 +1,20 @@ +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.HttpApi; +using Volo.Abp.TenantManagement; + +namespace Acme.BookStore +{ + [DependsOn( + typeof(BookStoreApplicationContractsModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpTenantManagementHttpApiModule), + typeof(AbpFeatureManagementHttpApiModule) + )] + public class BookStoreHttpApiModule : AbpModule + { + + } +} diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs b/samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs new file mode 100644 index 0000000000..4489c61c3c --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/BookStoreController.cs @@ -0,0 +1,13 @@ +using Acme.BookStore.Localization; +using Volo.Abp.AspNetCore.Mvc; + +namespace Acme.BookStore.Controllers +{ + public abstract class BookStoreController : AbpController + { + protected BookStoreController() + { + //LocalizationResource = typeof(BookStoreResource); + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/TestController.cs b/samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/TestController.cs new file mode 100644 index 0000000000..5f06bcfb4f --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi/Controllers/TestController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Mvc; +using Acme.BookStore.Models.Test; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Acme.BookStore.Controllers +{ + [Route("api/test")] + public class TestController : BookStoreController + { + public TestController() + { + + } + + [HttpGet] + [Route("")] + public async Task> GetAsync() + { + return new List + { + new TestModel {Name = "John", BirthDate = new DateTime(1942, 11, 18)}, + new TestModel {Name = "Adams", BirthDate = new DateTime(1997, 05, 24)} + }; + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs b/samples/BookStore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs new file mode 100644 index 0000000000..05381a8371 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.HttpApi/Models/Test/TestModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace Acme.BookStore.Models.Test +{ + public class TestModel + { + public string Name { get; set; } + + public DateTime BirthDate { get; set; } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj index 7509a9c9bb..a6e1fb1b77 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj +++ b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj @@ -1,10 +1,9 @@ - + netcoreapp2.2 - Acme.BookStore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true true @@ -20,26 +19,25 @@ - - - - - - + + + + + - + diff --git a/samples/BookStore/src/Acme.BookStore.Web/Branding/BookStoreBrandingProvider.cs b/samples/BookStore/src/Acme.BookStore.Web/BookStoreBrandingProvider.cs similarity index 89% rename from samples/BookStore/src/Acme.BookStore.Web/Branding/BookStoreBrandingProvider.cs rename to samples/BookStore/src/Acme.BookStore.Web/BookStoreBrandingProvider.cs index e73cccf6ab..4ccc981e61 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Branding/BookStoreBrandingProvider.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/BookStoreBrandingProvider.cs @@ -1,7 +1,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Components; using Volo.Abp.DependencyInjection; -namespace Acme.BookStore.Branding +namespace Acme.BookStore.Web { [Dependency(ReplaceServices = true)] public class BookStoreBrandingProvider : DefaultBrandingProvider diff --git a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebAutoMapperProfile.cs b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebAutoMapperProfile.cs index 86c57ce794..d2ae542615 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebAutoMapperProfile.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebAutoMapperProfile.cs @@ -1,12 +1,12 @@ using AutoMapper; -namespace Acme.BookStore +namespace Acme.BookStore.Web { public class BookStoreWebAutoMapperProfile : Profile { public BookStoreWebAutoMapperProfile() { - //Configure your AutoMapper mapping configuration here... + CreateMap(); } } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs index 235f287261..bbba8b543c 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs @@ -1,50 +1,42 @@ using System.IO; -using System.Linq; +using Acme.BookStore.EntityFrameworkCore; +using Acme.BookStore.Localization; +using Acme.BookStore.MultiTenancy; +using Acme.BookStore.Web.Menus; using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Acme.BookStore.EntityFrameworkCore; -using Acme.BookStore.Localization.BookStore; -using Acme.BookStore.Menus; -using Acme.BookStore.Permissions; using Swashbuckle.AspNetCore.Swagger; using Volo.Abp; using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.Authentication.JwtBearer; 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.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; -using Volo.Abp.Authorization.Permissions; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; -using Volo.Abp.Data; -using Volo.Abp.Identity; using Volo.Abp.Identity.Web; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement.Web; -using Volo.Abp.Threading; -using Volo.Abp.UI; +using Volo.Abp.TenantManagement.Web; using Volo.Abp.UI.Navigation; +using Volo.Abp.Ui.Navigation.Urls; using Volo.Abp.VirtualFileSystem; -using Volo.Abp.PermissionManagement; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.TenantManagement.Web; - -namespace Acme.BookStore +namespace Acme.BookStore.Web { [DependsOn( + typeof(BookStoreHttpApiModule), typeof(BookStoreApplicationModule), - typeof(BookStoreEntityFrameworkCoreModule), + typeof(BookStoreEntityFrameworkCoreDbMigrationsModule), typeof(AbpAutofacModule), typeof(AbpIdentityWebModule), - typeof(AbpAccountWebModule), + typeof(AbpAccountWebIdentityServerModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpTenantManagementWebModule) )] public class BookStoreWebModule : AbpModule @@ -56,7 +48,9 @@ namespace Acme.BookStore options.AddAssemblyResource( typeof(BookStoreResource), typeof(BookStoreDomainModule).Assembly, + typeof(BookStoreDomainSharedModule).Assembly, typeof(BookStoreApplicationModule).Assembly, + typeof(BookStoreApplicationContractsModule).Assembly, typeof(BookStoreWebModule).Assembly ); }); @@ -67,7 +61,8 @@ namespace Acme.BookStore var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - ConfigureDatabaseServices(); + ConfigureUrls(configuration); + ConfigureAuthentication(context, configuration); ConfigureAutoMapper(); ConfigureVirtualFileSystem(hostingEnvironment); ConfigureLocalizationServices(); @@ -76,18 +71,34 @@ namespace Acme.BookStore ConfigureSwaggerServices(context.Services); } - private void ConfigureDatabaseServices() + private void ConfigureUrls(IConfigurationRoot configuration) { - Configure(options => + Configure(options => { - options.UseSqlServer(); + options.Applications["MVC"].RootUrl = configuration["AppSelfUrl"]; }); } + private void ConfigureAuthentication(ServiceConfigurationContext context, IConfigurationRoot configuration) + { + context.Services.AddAuthentication() + .AddIdentityServerAuthentication(options => + { + options.Authority = configuration["AuthServer:Authority"]; + options.RequireHttpsMetadata = false; + options.ApiName = "BookStore"; + }); + } + private void ConfigureAutoMapper() { Configure(options => { + /* use `true` for the `validate` parameter if you want to + * validate the profile on application startup. + * See http://docs.automapper.org/en/stable/Configuration-validation.html for more + * about configuration validation. + */ options.AddProfile(); }); } @@ -98,7 +109,11 @@ namespace Acme.BookStore { Configure(options => { + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Acme.BookStore.Domain.Shared", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Acme.BookStore.Domain", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Acme.BookStore.Application.Contracts", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Acme.BookStore.Application", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(hostingEnvironment.ContentRootPath); }); } } @@ -110,7 +125,6 @@ namespace Acme.BookStore options.Resources .Get() .AddBaseTypes( - typeof(AbpValidationResource), typeof(AbpUiResource) ); @@ -146,7 +160,8 @@ namespace Acme.BookStore options.SwaggerDoc("v1", new Info { Title = "BookStore API", Version = "v1" }); options.DocInclusionPredicate((docName, description) => true); options.CustomSchemaIds(type => type.FullName); - }); + } + ); } public override void OnApplicationInitialization(ApplicationInitializationContext context) @@ -165,38 +180,22 @@ namespace Acme.BookStore app.UseVirtualFiles(); app.UseAuthentication(); + app.UseJwtTokenMiddleware(); - if (BookStoreConsts.IsMultiTenancyEnabled) + if (MultiTenancyConsts.IsEnabled) { app.UseMultiTenancy(); } + app.UseIdentityServer(); app.UseAbpRequestLocalization(); - app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookStore API"); }); - app.UseAuditing(); - app.UseMvcWithDefaultRouteAndArea(); - - SeedDatabase(context); - } - - private static void SeedDatabase(ApplicationInitializationContext context) - { - using (var scope = context.ServiceProvider.CreateScope()) - { - AsyncHelper.RunSync(async () => - { - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync(); - }); - } } } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs b/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs index 4b6aa2821a..78459ebb41 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs @@ -1,11 +1,12 @@ using System.Threading.Tasks; +using Acme.BookStore.Localization; +using Acme.BookStore.MultiTenancy; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; -using Acme.BookStore.Localization.BookStore; using Volo.Abp.TenantManagement.Web.Navigation; using Volo.Abp.UI.Navigation; -namespace Acme.BookStore.Menus +namespace Acme.BookStore.Web.Menus { public class BookStoreMenuContributor : IMenuContributor { @@ -19,19 +20,20 @@ namespace Acme.BookStore.Menus private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) { - if (!BookStoreConsts.IsMultiTenancyEnabled) + if (!MultiTenancyConsts.IsEnabled) { - ApplicationMenuItem administration = context.Menu.GetAdministration(); + var administration = context.Menu.GetAdministration(); administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName); } var l = context.ServiceProvider.GetRequiredService>(); context.Menu.Items.Insert(0, new ApplicationMenuItem("BookStore.Home", l["Menu:Home"], "/")); + context.Menu.AddItem( new ApplicationMenuItem("BooksStore", l["Menu:BookStore"]) .AddItem(new ApplicationMenuItem("BooksStore.Books", l["Menu:Books"], url: "/Books")) - ); + ); } } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageBase.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageBase.cs index 16aad9bfa4..57c9721951 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageBase.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageBase.cs @@ -1,9 +1,9 @@ -using Microsoft.AspNetCore.Mvc.Localization; +using Acme.BookStore.Localization; +using Microsoft.AspNetCore.Mvc.Localization; using Microsoft.AspNetCore.Mvc.Razor.Internal; -using Acme.BookStore.Localization.BookStore; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; -namespace Acme.BookStore.Pages +namespace Acme.BookStore.Web.Pages { public abstract class BookStorePageBase : AbpPage { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs index 5dd1fc918c..0a213892e8 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs @@ -1,7 +1,7 @@ -using Acme.BookStore.Localization.BookStore; +using Acme.BookStore.Localization; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; -namespace Acme.BookStore.Pages +namespace Acme.BookStore.Web.Pages { public abstract class BookStorePageModelBase : AbpPageModel { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml index 5766199fbc..04a6eee412 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml @@ -1,7 +1,7 @@ @page -@inherits Acme.BookStore.Pages.BookStorePageBase +@inherits Acme.BookStore.Web.Pages.BookStorePageBase @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model Acme.BookStore.Pages.Books.CreateModalModel +@model Acme.BookStore.Web.Pages.Books.CreateModalModel @{ Layout = null; } diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs index 1dc5f368fe..cca77771bd 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs @@ -1,7 +1,7 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Pages.Books +namespace Acme.BookStore.Web.Pages.Books { public class CreateModalModel : BookStorePageModelBase { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml index dc03c197d6..6f1bb03494 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml @@ -1,6 +1,6 @@ @page -@inherits Acme.BookStore.Pages.BookStorePageBase -@using Acme.BookStore.Pages.Books +@inherits Acme.BookStore.Web.Pages.BookStorePageBase +@using Acme.BookStore.Web.Pages.Books @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @model EditModalModel @{ diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml.cs index 89a3e3bb13..21aef6d072 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/EditModal.cshtml.cs @@ -2,7 +2,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Pages.Books +namespace Acme.BookStore.Web.Pages.Books { public class EditModalModel : BookStorePageModelBase { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml index 641652edf2..abaed993ca 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml @@ -1,9 +1,8 @@ @page -@using Acme.BookStore.Pages.Books -@inherits Acme.BookStore.Pages.BookStorePageBase -@model IndexModel +@inherits Acme.BookStore.Web.Pages.BookStorePageBase +@model Acme.BookStore.Web.Pages.Books.IndexModel @section scripts - { +{ } @@ -23,14 +22,14 @@ - - @L["Actions"] - @L["Name"] - @L["Type"] - @L["PublishDate"] - @L["Price"] - @L["CreationTime"] - + + @L["Actions"] + @L["Name"] + @L["Type"] + @L["PublishDate"] + @L["Price"] + @L["CreationTime"] + diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs index cc2b70329d..4d182bf266 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs @@ -1,16 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Acme.BookStore.Pages.Books +namespace Acme.BookStore.Web.Pages.Books { public class IndexModel : PageModel { public void OnGet() { + } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/index.js b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/index.js index e1f8e44804..b5c4da072d 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/index.js +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/index.js @@ -18,28 +18,28 @@ { rowAction: { items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - }, - { - text: l('Delete'), - confirmMessage: function (data) { - return l('BookDeletionConfirmationMessage', data.record.name); + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } }, - action: function (data) { - acme.bookStore.book - .delete(data.record.id) - .then(function() { - abp.notify.info(l('SuccessfullyDeleted')); - dataTable.ajax.reload(); - }); + { + text: l('Delete'), + confirmMessage: function (data) { + return l('BookDeletionConfirmationMessage', data.record.name); + }, + action: function (data) { + acme.bookStore.book + .delete(data.record.id) + .then(function () { + abp.notify.info(l('SuccessfullyDeleted')); + dataTable.ajax.reload(); + }); + } } - } - ] + ] } }, { data: "name" }, diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml index e6e24beeae..0107052885 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml @@ -1,9 +1,15 @@ @page -@using Acme.BookStore.Pages -@inherits BookStorePageBase -@model IndexModel +@inherits Acme.BookStore.Web.Pages.BookStorePageBase +@model Acme.BookStore.Web.Pages.IndexModel @section styles { - + + + +} +@section scripts { + + + } @L["Welcome"] @@ -13,7 +19,7 @@ {

@L["Login"]

} -
-

abp.io

+
+

abp.io

\ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml.cs index 9425a3fbbd..89e1e770e8 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml.cs @@ -1,4 +1,4 @@ -namespace Acme.BookStore.Pages +namespace Acme.BookStore.Web.Pages { public class IndexModel : BookStorePageModelBase { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.css b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.css new file mode 100644 index 0000000000..3f73b78b9f --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.css @@ -0,0 +1,3 @@ +body { + +} diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.js b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.js new file mode 100644 index 0000000000..46f089b9c7 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.js @@ -0,0 +1,3 @@ +$(function () { + abp.log.debug('Index.js initialized!'); +}); \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Program.cs b/samples/BookStore/src/Acme.BookStore.Web/Program.cs index 40b58ff6b1..0ed9fd6438 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Program.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Program.cs @@ -4,14 +4,18 @@ using Microsoft.AspNetCore.Hosting; using Serilog; using Serilog.Events; -namespace Acme.BookStore +namespace Acme.BookStore.Web { public class Program { public static int Main(string[] args) { Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() //TODO: Should be configurable! +#if DEBUG + .MinimumLevel.Debug() +#else + .MinimumLevel.Information() +#endif .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .WriteTo.File("Logs/logs.txt") diff --git a/samples/BookStore/src/Acme.BookStore.Web/Properties/launchSettings.json b/samples/BookStore/src/Acme.BookStore.Web/Properties/launchSettings.json index 6913413ef0..2503896399 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Properties/launchSettings.json +++ b/samples/BookStore/src/Acme.BookStore.Web/Properties/launchSettings.json @@ -4,7 +4,7 @@ "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:53929/", - "sslPort": 0 + "sslPort": 44361 } }, "profiles": { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Startup.cs b/samples/BookStore/src/Acme.BookStore.Web/Startup.cs index 0cd4c700d7..13db155180 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Startup.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Startup.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Volo.Abp; -namespace Acme.BookStore +namespace Acme.BookStore.Web { public class Startup { diff --git a/samples/BookStore/src/Acme.BookStore.Web/Views/_ViewImports.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Views/_ViewImports.cshtml index e4d518b1b8..c1da1f5f10 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Views/_ViewImports.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Views/_ViewImports.cshtml @@ -1,3 +1,4 @@ @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/samples/BookStore/src/Acme.BookStore.Web/abp.resourcemapping.js b/samples/BookStore/src/Acme.BookStore.Web/abp.resourcemapping.js index 96f7c92778..122e8e926a 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/abp.resourcemapping.js +++ b/samples/BookStore/src/Acme.BookStore.Web/abp.resourcemapping.js @@ -5,4 +5,4 @@ mappings: { } -} \ No newline at end of file +}; diff --git a/samples/BookStore/src/Acme.BookStore.Web/appsettings.Development.json b/samples/BookStore/src/Acme.BookStore.Web/appsettings.Development.json new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/appsettings.Development.json @@ -0,0 +1,2 @@ +{ +} diff --git a/samples/BookStore/src/Acme.BookStore.Web/appsettings.json b/samples/BookStore/src/Acme.BookStore.Web/appsettings.json index 2e5ae70aaa..c4f8c54b9c 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/appsettings.json +++ b/samples/BookStore/src/Acme.BookStore.Web/appsettings.json @@ -1,5 +1,16 @@ { + "AppSelfUrl": "https://localhost:44361", "ConnectionStrings": { "Default": "Server=localhost;Database=BookStore;Trusted_Connection=True;MultipleActiveResultSets=true" + }, + "AuthServer": { + "Authority": "https://localhost:44361" + }, + "IdentityServer": { + "Clients": { + "BookStore_ConsoleTestApp": { + "ClientId": "BookStore_ConsoleTestApp" + } + } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json b/samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json deleted file mode 100644 index 0f4f333f15..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "outputFile": "wwwroot/pages/index.css", - "inputFile": "wwwroot/pages/index.scss" - } -] \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json.defaults b/samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json.defaults deleted file mode 100644 index c75eb7d519..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Web/compilerconfig.json.defaults +++ /dev/null @@ -1,49 +0,0 @@ -{ - "compilers": { - "less": { - "autoPrefix": "", - "cssComb": "none", - "ieCompat": true, - "strictMath": false, - "strictUnits": false, - "relativeUrls": true, - "rootPath": "", - "sourceMapRoot": "", - "sourceMapBasePath": "", - "sourceMap": false - }, - "sass": { - "includePath": "", - "indentType": "space", - "indentWidth": 2, - "outputStyle": "nested", - "Precision": 5, - "relativeUrls": true, - "sourceMapRoot": "", - "sourceMap": false - }, - "stylus": { - "sourceMap": false - }, - "babel": { - "sourceMap": false - }, - "coffeescript": { - "bare": false, - "runtimeMode": "node", - "sourceMap": false - } - }, - "minifiers": { - "css": { - "enabled": true, - "termSemicolons": true, - "gzip": false - }, - "javascript": { - "enabled": true, - "termSemicolons": true, - "gzip": false - } - } -} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/package.json b/samples/BookStore/src/Acme.BookStore.Web/package.json index 6d3170da8c..ef4fcf2350 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/package.json +++ b/samples/BookStore/src/Acme.BookStore.Web/package.json @@ -1,6 +1,6 @@ { - "version": "0.1.0", - "name": "Acme.BookStore", + "version": "1.0.0", + "name": "my-app", "private": true, "dependencies": { "@abp/aspnetcore.mvc.ui.theme.basic": "^0.4.9" diff --git a/samples/BookStore/src/Acme.BookStore.Web/tempkey.rsa b/samples/BookStore/src/Acme.BookStore.Web/tempkey.rsa new file mode 100644 index 0000000000..f3b32de233 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/tempkey.rsa @@ -0,0 +1 @@ +{"KeyId":"ac0d2edf3c04d13cd95cc41b9b33ab03","Parameters":{"D":"FFymEWbX3XBT5YnTngOKwtz3XKsyaQbyDvvw9jbmkdvLKUmrb1hkmylqVYwU/3G1u79rrD8AZXJDoYVLegyZymK/iNeePMLI4i5vScF7PdQXn/g6CvQ8j3J60YYyfDWuxjBH8nCEUIfQIv14BpcH6CWi1BVZUbnbWcpe2ji8D5I3FHOZpvksQztst5eE836ODdN9jgk35kgrdUQ14MEFHA6m6fAzvFI1csFxD3Kwej4rI8RYZ0WYLkndz9ID88+v9VxqI8+wN6wR6tIOR510uT1FI5wONBVBUzgeZ6cCEpg0jC9tgqcP03gMDpmE7vKp34ExxH/iOWyhQ0gAxHOVlQ==","DP":"qSQfNZvEkepgY12d+uwTbRoOp+0g1CBiMU9kqyoIB56hAUnzENSCDzunjLRrvDLFPgXiUcoccskyVRnKKOGPOqPE6VjgzBrdLgA/hBf8hPg0GnTVoPyLxR9G6GsGUKsAYVn8G7cnK5wXzK4jCjsflkfxCzFfdASJ/+sa5QPWZMM=","DQ":"u+56T1+rhMvlurid9kBS2Ypfm4vOiNAXLD9kGz2wx8Ob0yYlWo55kn11qPs6Ej9bnQIY3N+TY2tXMamfhAhntoHaKrFjOpCmlHZ0GAeQOJVuWSlFvu/NBoxfjZzcUCNua22oJjy++wSdkkLLGEqau62byaQoSSqUxUzwL36RexM=","Exponent":"AQAB","InverseQ":"E+uq9g6D5LjUk+M7gtt0srnT8duwu8P83AgFqjtGOnSCy71omSboxb4zC9bGq/WaEFauFBwqxbkXwFyXuYNfIelfmSERulU9jgf0+KH6QmFdtjrJ5UO7VArqET1WUquwiDvOyO8udCxi8RRAiM5G3dTzIs5JTalGhlKEZSAgPtQ=","Modulus":"rgHACxzqvuE72RF/NdDTLsIEy3F/n6P4lkgrER60FU8uRNwSmAMRxvxYOaE3Ot/krRYcw2+MP8ewR1VBXywXVT1zuACA3SacMHJYmZQ2UkuwsD9bmpjvqoMhR/hjsI74jTzKpclHtEu7D7WYDZaIPAEIs/8+5H/z1mXVfgACaeaQt3C0OhwXSOPPDP71VKGfoFucXYED1keZ0PKxYAlhiHOe7cnSlfJseujwD2Rhyq8mUhe6aEMTYBjuruWgpfvnSOARAqu5vwzK35KpAirHwa1DJSZyanNMFdlLkVNKWUKEqd6PwRneiHacmaaDF6oQQstuSbf9cuJeSMbKh7WVQQ==","P":"0CJDit2NHk0Z1bN5ZVIYZRUYbrAI2bEOafAKqfffcA/Os7yXsY14Ye4pSpDxfdZGcPGRL04HPkJsogFtyI7k4ujrvsC66I5cg45+BhBMM0zyLJ7LZkD2HGwX2+a/xrXhhIIOnGWWy2zzW3dkayRhi1bR9krfTA5uBw1LX9qZ3Yc=","Q":"1gZITAaB+r0+PgOfyDCeVzSnTyQuKSkgbUkIgQP9jQZa6edrbAXogdJipxmUTrW7JaxifG1z9ubK+TOqhjZHqT4gd8U8Bh7jCBizZNVe60pez1OtNGpEOW2N+ZrXBSMNcV8PFaMg/B+fcaX+i7NWpTqmztR/V0DGXmD+XosuaPc="}} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css deleted file mode 100644 index e02abfc9b0..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css +++ /dev/null @@ -1 +0,0 @@ - diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css deleted file mode 100644 index 5f282702bb..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss deleted file mode 100644 index b945ade091..0000000000 --- a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -body{ - -} diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj index 31415fb6c8..2ffa2d87a1 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj @@ -9,20 +9,11 @@ - - - + - - - - - - - - +
diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs index 24f530b735..5263dc5ea4 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestBase.cs @@ -1,12 +1,7 @@ -using Volo.Abp; - -namespace Acme.BookStore +namespace Acme.BookStore { - public abstract class BookStoreApplicationTestBase : AbpIntegratedTest + public abstract class BookStoreApplicationTestBase : BookStoreTestBase { - protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) - { - options.UseAutofac(); - } + } } diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs index 102a983013..40fee21794 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs @@ -1,78 +1,13 @@ -using Microsoft.Data.Sqlite; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; -using Acme.BookStore.EntityFrameworkCore; -using Volo.Abp; -using Volo.Abp.Autofac; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.Modularity; +using Volo.Abp.Modularity; namespace Acme.BookStore { [DependsOn( typeof(BookStoreApplicationModule), - typeof(BookStoreEntityFrameworkCoreModule), - typeof(AbpAutofacModule), - typeof(AbpTestBaseModule) + typeof(BookStoreDomainTestModule) )] public class BookStoreApplicationTestModule : AbpModule { - private SqliteConnection _sqliteConnection; - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddAlwaysAllowAuthorization(); - - ConfigureInMemorySqlite(context.Services); - } - - private void ConfigureInMemorySqlite(IServiceCollection services) - { - _sqliteConnection = CreateDatabaseAndGetConnection(); - - services.Configure(options => - { - options.Configure(context => { context.DbContextOptions.UseSqlite(_sqliteConnection); }); - }); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - SeedTestData(context); - } - - 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 BookStoreMigrationsDbContext(options)) - { - context.GetService().CreateTables(); - } - - return connection; - } - - private static void SeedTestData(ApplicationInitializationContext context) - { - using (var scope = context.ServiceProvider.CreateScope()) - { - scope.ServiceProvider - .GetRequiredService() - .Build(); - } - } } } \ No newline at end of file diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs new file mode 100644 index 0000000000..cd059e5639 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleAppServiceTests.cs @@ -0,0 +1,33 @@ +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"); + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs deleted file mode 100644 index 0470eaec1e..0000000000 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Acme.BookStore.Users; -using Shouldly; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.Identity; -using Volo.Abp.Uow; -using Xunit; - -namespace Acme.BookStore.Samples -{ - public class SampleTests : BookStoreApplicationTestBase - { - private readonly IIdentityUserAppService _userAppService; - private readonly IRepository _appUserRepository; - private readonly IUnitOfWorkManager _unitOfWorkManager; - - public SampleTests() - { - _userAppService = ServiceProvider.GetRequiredService(); - _appUserRepository = ServiceProvider.GetRequiredService>(); - _unitOfWorkManager = ServiceProvider.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"); - } - - [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. - */ - using (var uow = _unitOfWorkManager.Begin()) - { - //Act - var adminUser = await _appUserRepository - .Where(u => u.UserName == "admin") - .FirstOrDefaultAsync(); - - //Assert - adminUser.ShouldNotBeNull(); - - await uow.CompleteAsync(); - } - } - } -} diff --git a/samples/BookStore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj new file mode 100644 index 0000000000..610d67b5bc --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Domain.Tests/Acme.BookStore.Domain.Tests.csproj @@ -0,0 +1,18 @@ + + + + + + netcoreapp2.2 + Acme.BookStore + + + + + + + + + + + diff --git a/samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs b/samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs new file mode 100644 index 0000000000..a8d86b009d --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestBase.cs @@ -0,0 +1,7 @@ +namespace Acme.BookStore +{ + public abstract class BookStoreDomainTestBase : BookStoreTestBase + { + + } +} diff --git a/samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs b/samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs new file mode 100644 index 0000000000..7b3fb6fc79 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Domain.Tests/BookStoreDomainTestModule.cs @@ -0,0 +1,13 @@ +using Acme.BookStore.EntityFrameworkCore; +using Volo.Abp.Modularity; + +namespace Acme.BookStore +{ + [DependsOn( + typeof(BookStoreEntityFrameworkCoreTestModule) + )] + public class BookStoreDomainTestModule : AbpModule + { + + } +} \ No newline at end of file diff --git a/samples/BookStore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs b/samples/BookStore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs new file mode 100644 index 0000000000..0d8978e7f5 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Domain.Tests/Samples/SampleDomainTests.cs @@ -0,0 +1,45 @@ +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"); + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj new file mode 100644 index 0000000000..7c0705012f --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/Acme.BookStore.EntityFrameworkCore.Tests.csproj @@ -0,0 +1,21 @@ + + + + + + netcoreapp2.2 + Acme.BookStore + + + + + + + + + + + + + + diff --git a/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs new file mode 100644 index 0000000000..792c2c3a12 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestBase.cs @@ -0,0 +1,9 @@ +using Volo.Abp; + +namespace Acme.BookStore.EntityFrameworkCore +{ + public abstract class BookStoreEntityFrameworkCoreTestBase : BookStoreTestBase + { + + } +} diff --git a/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs new file mode 100644 index 0000000000..e1171d6d90 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/BookStoreEntityFrameworkCoreTestModule.cs @@ -0,0 +1,57 @@ +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.Modularity; + +namespace Acme.BookStore.EntityFrameworkCore +{ + [DependsOn( + typeof(BookStoreEntityFrameworkCoreDbMigrationsModule), + typeof(BookStoreTestBaseModule) + )] + 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 BookStoreMigrationsDbContext(options)) + { + context.GetService().CreateTables(); + } + + return connection; + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs new file mode 100644 index 0000000000..3cda13f3ea --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Acme.BookStore.Users; +using Shouldly; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +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 _appUserRepository + .Where(u => u.UserName == "admin") + .FirstOrDefaultAsync(); + + //Assert + adminUser.ShouldNotBeNull(); + }); + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj new file mode 100644 index 0000000000..325c7af448 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Acme.BookStore.HttpApi.Client.ConsoleTestApp.csproj @@ -0,0 +1,24 @@ + + + + Exe + netcoreapp2.2 + + + + + + + + + PreserveNewest + Always + + + + + + + + + diff --git a/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs new file mode 100644 index 0000000000..4115bcd2ca --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/BookStoreConsoleApiClientModule.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Http.Client.IdentityModel; +using Volo.Abp.Modularity; + +namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp +{ + [DependsOn( + typeof(BookStoreHttpApiClientModule), + typeof(AbpHttpClientIdentityModelModule) + )] + public class BookStoreConsoleApiClientModule : AbpModule + { + + } +} diff --git a/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs new file mode 100644 index 0000000000..edfde1aae6 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs @@ -0,0 +1,26 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; + +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}"); + } + } +} \ No newline at end of file diff --git a/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs new file mode 100644 index 0000000000..ecef29d963 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/Program.cs @@ -0,0 +1,24 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Threading; + +namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp +{ + class Program + { + static void Main(string[] args) + { + using (var application = AbpApplicationFactory.Create()) + { + application.Initialize(); + + var demo = application.ServiceProvider.GetRequiredService(); + AsyncHelper.RunSync(() => demo.RunAsync()); + + Console.WriteLine("Press ENTER to stop application..."); + Console.ReadLine(); + } + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json new file mode 100644 index 0000000000..c220f47daf --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.HttpApi.Client.ConsoleTestApp/appsettings.json @@ -0,0 +1,18 @@ +{ + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44361/" + } + }, + "IdentityClients": { + "Default": { + "GrantType": "password", + "ClientId": "BookStore_ConsoleTestApp", + "ClientSecret": "1q2w3e*", + "UserName": "admin", + "UserPassword": "1q2w3E*", + "Authority": "https://localhost:44361", + "Scope": "BookStore" + } + } +} \ No newline at end of file diff --git a/samples/BookStore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj b/samples/BookStore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj new file mode 100644 index 0000000000..882396615e --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.TestBase/Acme.BookStore.TestBase.csproj @@ -0,0 +1,26 @@ + + + + + + netcoreapp2.2 + Acme.BookStore + + + + + + + + + + + + + + + + + + + diff --git a/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs b/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs new file mode 100644 index 0000000000..ba9d7c6b57 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBase.cs @@ -0,0 +1,100 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; + +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 void WithUnitOfWork(Action action) + { + WithUnitOfWork(new UnitOfWorkOptions(), action); + } + + protected virtual void WithUnitOfWork(UnitOfWorkOptions options, Action action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + action(); + + uow.Complete(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new UnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(UnitOfWorkOptions 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 TResult WithUnitOfWork(Func func) + { + return WithUnitOfWork(new UnitOfWorkOptions(), func); + } + + protected virtual TResult WithUnitOfWork(UnitOfWorkOptions options, Func func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = func(); + uow.Complete(); + return result; + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new UnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(UnitOfWorkOptions 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/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs b/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs new file mode 100644 index 0000000000..3674dd6503 --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestBaseModule.cs @@ -0,0 +1,48 @@ +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(BookStoreDomainModule) + )] + 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/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs b/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs similarity index 61% rename from samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs rename to samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs index 4d31c1d4cb..eb11db2b11 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs +++ b/samples/BookStore/test/Acme.BookStore.TestBase/BookStoreTestDataSeedContributor.cs @@ -3,34 +3,29 @@ using System.Threading.Tasks; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; -using Volo.Abp.Identity; -using Volo.Abp.Threading; +using Volo.Abp.Guids; namespace Acme.BookStore { - public class BookStoreTestDataBuilder : ITransientDependency + public class BookStoreTestDataSeedContributor : IDataSeedContributor, ITransientDependency { - private readonly IDataSeeder _dataSeeder; private readonly IRepository _bookRepository; + private readonly IGuidGenerator _guidGenerator; - public BookStoreTestDataBuilder(IDataSeeder dataSeeder, IRepository bookRepository) + public BookStoreTestDataSeedContributor( + IRepository bookRepository, + IGuidGenerator guidGenerator) { - _dataSeeder = dataSeeder; _bookRepository = bookRepository; + _guidGenerator = guidGenerator; } - public void Build() + public async Task SeedAsync(DataSeedContext context) { - AsyncHelper.RunSync(BuildInternalAsync); - } - - public async Task BuildInternalAsync() - { - await _dataSeeder.SeedAsync(); await _bookRepository.InsertAsync( new Book { - Id = Guid.NewGuid(), + Id = _guidGenerator.Create(), Name = "Test book 1", Type = BookType.Fantastic, PublishDate = new DateTime(2015, 05, 24), @@ -41,7 +36,7 @@ namespace Acme.BookStore await _bookRepository.InsertAsync( new Book { - Id = Guid.NewGuid(), + Id = _guidGenerator.Create(), Name = "Test book 2", Type = BookType.Science, PublishDate = new DateTime(2014, 02, 11), diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj index 263836714f..751672baee 100644 --- a/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj +++ b/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj @@ -14,10 +14,10 @@ - + - + diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs b/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs index efae3e3755..c544d97116 100644 --- a/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs +++ b/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs @@ -4,17 +4,13 @@ using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc.ApplicationParts; -using Microsoft.AspNetCore.Mvc.Internal; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Acme.BookStore.Localization.BookStore; -using Acme.BookStore.Menus; +using Acme.BookStore.Localization; +using Acme.BookStore.Web; +using Acme.BookStore.Web.Menus; using Volo.Abp; -using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AspNetCore.TestBase; -using Volo.Abp.Identity.Web; using Volo.Abp.Localization; using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; @@ -24,10 +20,8 @@ namespace Acme.BookStore { [DependsOn( typeof(AbpAspNetCoreTestBaseModule), - typeof(BookStoreApplicationTestModule), - typeof(AbpIdentityWebModule), - typeof(AbpAccountWebModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule) + typeof(BookStoreWebModule), + typeof(BookStoreApplicationTestModule) )] public class BookStoreWebTestModule : AbpModule { diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/Pages/Index_Tests.cs b/samples/BookStore/test/Acme.BookStore.Web.Tests/Pages/Index_Tests.cs new file mode 100644 index 0000000000..1964a8946e --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Web.Tests/Pages/Index_Tests.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Acme.BookStore.Pages +{ + public class Index_Tests : BookStoreWebTestBase + { + [Fact] + public async Task Welcome_Page() + { + var response = await GetResponseAsStringAsync("/Books"); + response.ShouldNotBeNull(); + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/Samples/SampleWebTest.cs b/samples/BookStore/test/Acme.BookStore.Web.Tests/Samples/SampleWebTest.cs deleted file mode 100644 index 2192ff8559..0000000000 --- a/samples/BookStore/test/Acme.BookStore.Web.Tests/Samples/SampleWebTest.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Threading.Tasks; -using Shouldly; -using Xunit; - -namespace Acme.BookStore.Samples -{ - public class SampleWebTest : BookStoreWebTestBase - { - [Fact(Skip = "This is disabled since not working")] - public async Task Welcome_Page() - { - var response = await GetResponseAsStringAsync("/"); - response.ShouldNotBeNull(); - } - - [Fact(Skip = "This is disabled since not working")] - public async Task Login_Page() - { - var response = await GetResponseAsStringAsync("/Account/Login/"); - response.ShouldNotBeNull(); - } - } -}