From 226c03b5732888cfe10e9e5d60ab84df0eadc6a6 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Wed, 13 Sep 2017 14:53:06 +0200 Subject: [PATCH 01/41] Refactoring all dbcontext seed using new MigrateDbContext extension method on IWebHost. This prevent errors when using dotnet ef cli and seeders in Startup --- eShopOnContainers.sln | 63 ++++++++- .../WebHost.Customization.csproj | 11 ++ .../WebHostExtensions.cs | 40 ++++++ .../Catalog/Catalog.API/Catalog.API.csproj | 1 + .../Infrastructure/CatalogContextSeed.cs | 122 +++++++++--------- src/Services/Catalog/Catalog.API/Program.cs | 20 ++- src/Services/Catalog/Catalog.API/Startup.cs | 49 +------ .../Identity/Identity.API/AppSettings.cs | 8 +- .../Identity.API/Certificate/Certificate.cs | 7 +- .../Identity.API/Configuration/Config.cs | 2 +- .../Controllers/AccountController.cs | 15 +-- .../Controllers/ConsentController.cs | 14 +- .../Controllers/HomeController.cs | 12 +- .../Identity.API/Data/ApplicationDbContext.cs | 6 +- ...extSeed.cs => ApplicationDbContextSeed.cs} | 88 ++++++------- .../Data/ConfigurationDbContextSeed.cs | 56 ++++++++ .../Extensions/LinqSelectExtensions.cs | 2 +- .../Identity/Identity.API/Identity.API.csproj | 1 + .../20170912114036_Initial.Designer.cs | 4 +- .../ApplicationDbContextModelSnapshot.cs | 5 +- .../AccountViewModels/ConsentInputModel.cs | 8 +- .../AccountViewModels/ConsentViewModel.cs | 6 +- .../ExternalLoginConfirmationViewModel.cs | 8 +- .../ForgotPasswordViewModel.cs | 8 +- .../AccountViewModels/LoggedOutViewModel.cs | 6 +- .../AccountViewModels/LoginViewModel.cs | 8 +- .../AccountViewModels/LogoutViewModel.cs | 6 +- .../AccountViewModels/RegisterViewModel.cs | 8 +- .../ResetPasswordViewModel.cs | 8 +- .../AccountViewModels/SendCodeViewModel.cs | 7 +- .../AccountViewModels/VerifyCodeViewModel.cs | 8 +- .../AccountViewModels/_LoginViewModel.cs | 20 --- .../Identity.API/Models/ApplicationUser.cs | 2 +- .../Identity.API/Models/ErrorViewModel.cs | 2 +- .../AddPhoneNumberViewModel.cs | 8 +- .../ChangePasswordViewModel.cs | 8 +- .../ConfigureTwoFactorViewModel.cs | 7 +- .../ManageViewModels/FactorViewModel.cs | 7 +- .../Models/ManageViewModels/IndexViewModel.cs | 7 +- .../ManageViewModels/ManageLoginsViewModel.cs | 9 +- .../ManageViewModels/RemoveLoginViewModel.cs | 8 +- .../ManageViewModels/SetPasswordViewModel.cs | 8 +- .../VerifyPhoneNumberViewModel.cs | 8 +- src/Services/Identity/Identity.API/Program.cs | 31 ++++- .../Identity.API/Services/EFLoginService.cs | 9 +- .../Identity.API/Services/IEmailSender.cs | 7 +- .../Identity.API/Services/ILoginService.cs | 7 +- .../Identity.API/Services/IRedirectService.cs | 7 +- .../Identity.API/Services/ISmsSender.cs | 7 +- .../Identity.API/Services/MessageServices.cs | 7 +- .../Identity.API/Services/ProfileService.cs | 14 +- .../Identity.API/Services/RedirectService.cs | 8 +- src/Services/Identity/Identity.API/Startup.cs | 76 +---------- .../Infrastructure/MarketingContextSeed.cs | 41 ++++-- .../MarketingReadDataContext.cs | 3 + .../Marketing.API/Marketing.API.csproj | 1 + .../Marketing/Marketing.API/Program.cs | 13 +- .../Marketing/Marketing.API/Startup.cs | 31 +---- .../Infrastructure/OrderingContextSeed.cs | 100 ++++++++------ .../Ordering/Ordering.API/Ordering.API.csproj | 1 + src/Services/Ordering/Ordering.API/Program.cs | 19 ++- src/Services/Ordering/Ordering.API/Startup.cs | 45 ++----- 62 files changed, 539 insertions(+), 589 deletions(-) create mode 100644 src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj create mode 100644 src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs rename src/Services/Identity/Identity.API/Data/{ApplicationContextSeed.cs => ApplicationDbContextSeed.cs} (77%) create mode 100644 src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs delete mode 100644 src/Services/Identity/Identity.API/Models/AccountViewModels/_LoginViewModel.cs diff --git a/eShopOnContainers.sln b/eShopOnContainers.sln index ae44be741..07c183057 100644 --- a/eShopOnContainers.sln +++ b/eShopOnContainers.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.8 +VisualStudioVersion = 15.0.26730.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{FEA0C318-FFED-4D39-8781-265718CA43DD}" ProjectSection(ProjectDependencies) = postProject @@ -60,7 +60,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSPA", "src\Web\WebSPA\We EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile Apps", "Mobile Apps", "{B7B1D395-4E06-4036-BE86-C216756B9367}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UnitTests", "src\Mobile\eShopOnContainers\eShopOnContainers.UnitTests\eShopOnContainers.UnitTests.csproj", "{F7B6A162-BC4D-4924-B16A-713F9B0344E7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "eShopOnContainers.UnitTests", "src\Mobile\eShopOnContainers\eShopOnContainers.UnitTests\eShopOnContainers.UnitTests.csproj", "{F7B6A162-BC4D-4924-B16A-713F9B0344E7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Droid", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Droid\eShopOnContainers.TestRunner.Droid.csproj", "{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}" EndProject @@ -76,7 +76,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IntegrationTests", "test\Se EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UITests", "src\Mobile\eShopOnContainers\eShopOnContainers.UITests\eShopOnContainers.UITests.csproj", "{E3B18084-842C-4B80-8E4A-A7E588EC3137}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Core", "src\Mobile\eShopOnContainers\eShopOnContainers.Core\eShopOnContainers.Core.csproj", "{67F9D3A8-F71E-4428-913F-C37AE82CDB24}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "eShopOnContainers.Core", "src\Mobile\eShopOnContainers\eShopOnContainers.Core\eShopOnContainers.Core.csproj", "{67F9D3A8-F71E-4428-913F-C37AE82CDB24}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTest", "test\Services\UnitTest\UnitTest.csproj", "{7796F5D8-31FC-45A4-B673-19DE5BA194CF}" EndProject @@ -132,6 +132,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Payment", "Payment", "{D5D3 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Payment.API", "src\Services\Payment\Payment.API\Payment.API.csproj", "{2A795FEA-2EB7-45F5-9B30-35E0810CB238}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebHost", "WebHost", "{3E51A82A-5DE1-482E-BA46-F4FF3138B41A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebHost.Customization", "src\BuildingBlocks\WebHostCustomization\WebHost.Customization\WebHost.Customization.csproj", "{BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1877,6 +1881,54 @@ Global {2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x64.Build.0 = Release|Any CPU {2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x86.ActiveCfg = Release|Any CPU {2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x86.Build.0 = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|ARM.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|iPhone.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|x64.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|x64.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|x86.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.AppStore|x86.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|ARM.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|ARM.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|iPhone.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|x64.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Debug|x86.Build.0 = Debug|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|Any CPU.Build.0 = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|ARM.ActiveCfg = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|ARM.Build.0 = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|iPhone.ActiveCfg = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|iPhone.Build.0 = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|x64.ActiveCfg = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|x64.Build.0 = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|x86.ActiveCfg = Release|Any CPU + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1937,5 +1989,10 @@ Global {6C6A69FE-A484-4E75-AFEC-827EA354AF46} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} {D5D3841D-F282-4E60-B9CB-267A1BF2D893} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} {2A795FEA-2EB7-45F5-9B30-35E0810CB238} = {D5D3841D-F282-4E60-B9CB-267A1BF2D893} + {3E51A82A-5DE1-482E-BA46-F4FF3138B41A} = {1EF3AC0F-F27C-46DD-AC53-D762D2C11C45} + {BF6AF4F9-684A-4EB3-8CF2-230AA2A03F98} = {3E51A82A-5DE1-482E-BA46-F4FF3138B41A} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A6439048-F270-4A9E-A350-63C7BE2BB322} EndGlobalSection EndGlobal diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj new file mode 100644 index 000000000..d9ddd56e9 --- /dev/null +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj @@ -0,0 +1,11 @@ + + + + netcoreapp2.0 + + + + + + + diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs new file mode 100644 index 000000000..ecaceeab0 --- /dev/null +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; + +namespace Microsoft.AspNetCore.Hosting +{ + public static class IWebHostExtensions + { + public static IWebHost MigrateDbContext(this IWebHost webHost, Action seeder) where TContext : DbContext + { + using (var scope = webHost.Services.CreateScope()) + { + var services = scope.ServiceProvider; + + var logger = services.GetRequiredService>(); + + var context = services.GetService(); + + try + { + logger.LogInformation($"Migrating database associated with context {typeof(TContext).Name}"); + + context.Database + .Migrate(); + + seeder(context,services); + + logger.LogInformation($"Migrated database associated with context {typeof(TContext).Name}"); + } + catch (Exception ex) + { + logger.LogError(ex, $"An error occurred while migrating the database used on context {typeof(TContext).Name}"); + } + } + + return webHost; + } + } +} diff --git a/src/Services/Catalog/Catalog.API/Catalog.API.csproj b/src/Services/Catalog/Catalog.API/Catalog.API.csproj index de280179f..0d8c77efd 100644 --- a/src/Services/Catalog/Catalog.API/Catalog.API.csproj +++ b/src/Services/Catalog/Catalog.API/Catalog.API.csproj @@ -53,6 +53,7 @@ + diff --git a/src/Services/Catalog/Catalog.API/Infrastructure/CatalogContextSeed.cs b/src/Services/Catalog/Catalog.API/Infrastructure/CatalogContextSeed.cs index 6f71bd6cf..42ac7b740 100644 --- a/src/Services/Catalog/Catalog.API/Infrastructure/CatalogContextSeed.cs +++ b/src/Services/Catalog/Catalog.API/Infrastructure/CatalogContextSeed.cs @@ -1,15 +1,14 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure { - using EntityFrameworkCore; using Extensions.Logging; using global::Catalog.API.Extensions; - using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; - using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Model; + using Polly; using System; using System.Collections.Generic; + using System.Data.SqlClient; using System.Globalization; using System.IO; using System.IO.Compression; @@ -19,56 +18,48 @@ public class CatalogContextSeed { - public static async Task SeedAsync(IApplicationBuilder applicationBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory, int? retry = 0) + public async Task SeedAsync(CatalogContext context,IHostingEnvironment env,IOptions settings,ILogger logger) { - var log = loggerFactory.CreateLogger("catalog seed"); + var policy = CreatePolicy(logger, nameof(CatalogContextSeed)); - var context = (CatalogContext)applicationBuilder - .ApplicationServices.GetService(typeof(CatalogContext)); - - context.Database.Migrate(); - - var settings = (CatalogSettings)applicationBuilder - .ApplicationServices.GetRequiredService>().Value; - - var useCustomizationData = settings.UseCustomizationData; - var contentRootPath = env.ContentRootPath; - var picturePath = env.WebRootPath; - - if (!context.CatalogBrands.Any()) + await policy.ExecuteAsync(async () => { - context.CatalogBrands.AddRange(useCustomizationData - ? GetCatalogBrandsFromFile(contentRootPath, log) - : GetPreconfiguredCatalogBrands() - ); + var useCustomizationData = settings.Value.UseCustomizationData; + var contentRootPath = env.ContentRootPath; + var picturePath = env.WebRootPath; - await context.SaveChangesAsync(); - } + if (!context.CatalogBrands.Any()) + { + context.CatalogBrands.AddRange(useCustomizationData + ? GetCatalogBrandsFromFile(contentRootPath, logger) + : GetPreconfiguredCatalogBrands()); - if (!context.CatalogTypes.Any()) - { - context.CatalogTypes.AddRange(useCustomizationData - ? GetCatalogTypesFromFile(contentRootPath, log) - : GetPreconfiguredCatalogTypes() - ); + await context.SaveChangesAsync(); + } - await context.SaveChangesAsync(); - } + if (!context.CatalogTypes.Any()) + { + context.CatalogTypes.AddRange(useCustomizationData + ? GetCatalogTypesFromFile(contentRootPath, logger) + : GetPreconfiguredCatalogTypes()); - if (!context.CatalogItems.Any()) - { - context.CatalogItems.AddRange(useCustomizationData - ? GetCatalogItemsFromFile(contentRootPath, context, log) - : GetPreconfiguredItems() - ); + await context.SaveChangesAsync(); + } - await context.SaveChangesAsync(); + if (!context.CatalogItems.Any()) + { + context.CatalogItems.AddRange(useCustomizationData + ? GetCatalogItemsFromFile(contentRootPath, context, logger) + : GetPreconfiguredItems()); - GetCatalogItemPictures(contentRootPath, picturePath); - } + await context.SaveChangesAsync(); + + GetCatalogItemPictures(contentRootPath, picturePath); + } + }); } - static IEnumerable GetCatalogBrandsFromFile(string contentRootPath, ILogger log) + private IEnumerable GetCatalogBrandsFromFile(string contentRootPath, ILogger logger) { string csvFileCatalogBrands = Path.Combine(contentRootPath, "Setup", "CatalogBrands.csv"); @@ -85,18 +76,18 @@ } catch (Exception ex) { - log.LogError(ex.Message); + logger.LogError(ex.Message); return GetPreconfiguredCatalogBrands(); } return File.ReadAllLines(csvFileCatalogBrands) .Skip(1) // skip header row .SelectTry(x => CreateCatalogBrand(x)) - .OnCaughtException(ex => { log.LogError(ex.Message); return null; }) + .OnCaughtException(ex => { logger.LogError(ex.Message); return null; }) .Where(x => x != null); } - static CatalogBrand CreateCatalogBrand(string brand) + private CatalogBrand CreateCatalogBrand(string brand) { brand = brand.Trim('"').Trim(); @@ -111,7 +102,7 @@ }; } - static IEnumerable GetPreconfiguredCatalogBrands() + private IEnumerable GetPreconfiguredCatalogBrands() { return new List() { @@ -123,7 +114,7 @@ }; } - static IEnumerable GetCatalogTypesFromFile(string contentRootPath, ILogger log) + private IEnumerable GetCatalogTypesFromFile(string contentRootPath, ILogger logger) { string csvFileCatalogTypes = Path.Combine(contentRootPath, "Setup", "CatalogTypes.csv"); @@ -140,18 +131,18 @@ } catch (Exception ex) { - log.LogError(ex.Message); + logger.LogError(ex.Message); return GetPreconfiguredCatalogTypes(); } return File.ReadAllLines(csvFileCatalogTypes) .Skip(1) // skip header row .SelectTry(x => CreateCatalogType(x)) - .OnCaughtException(ex => { log.LogError(ex.Message); return null; }) + .OnCaughtException(ex => { logger.LogError(ex.Message); return null; }) .Where(x => x != null); } - static CatalogType CreateCatalogType(string type) + private CatalogType CreateCatalogType(string type) { type = type.Trim('"').Trim(); @@ -166,7 +157,7 @@ }; } - static IEnumerable GetPreconfiguredCatalogTypes() + private IEnumerable GetPreconfiguredCatalogTypes() { return new List() { @@ -177,7 +168,7 @@ }; } - static IEnumerable GetCatalogItemsFromFile(string contentRootPath, CatalogContext context, ILogger log) + private IEnumerable GetCatalogItemsFromFile(string contentRootPath, CatalogContext context, ILogger logger) { string csvFileCatalogItems = Path.Combine(contentRootPath, "Setup", "CatalogItems.csv"); @@ -195,7 +186,7 @@ } catch (Exception ex) { - log.LogError(ex.Message); + logger.LogError(ex.Message); return GetPreconfiguredItems(); } @@ -206,11 +197,11 @@ .Skip(1) // skip header row .Select(row => Regex.Split(row, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") ) .SelectTry(column => CreateCatalogItem(column, csvheaders, catalogTypeIdLookup, catalogBrandIdLookup)) - .OnCaughtException(ex => { log.LogError(ex.Message); return null; }) + .OnCaughtException(ex => { logger.LogError(ex.Message); return null; }) .Where(x => x != null); } - static CatalogItem CreateCatalogItem(string[] column, string[] headers, Dictionary catalogTypeIdLookup, Dictionary catalogBrandIdLookup) + private CatalogItem CreateCatalogItem(string[] column, string[] headers, Dictionary catalogTypeIdLookup, Dictionary catalogBrandIdLookup) { if (column.Count() != headers.Count()) { @@ -316,7 +307,7 @@ return catalogItem; } - static IEnumerable GetPreconfiguredItems() + private IEnumerable GetPreconfiguredItems() { return new List() { @@ -335,7 +326,7 @@ }; } - static string[] GetHeaders(string csvfile, string[] requiredHeaders, string[] optionalHeaders = null) + private string[] GetHeaders(string csvfile, string[] requiredHeaders, string[] optionalHeaders = null) { string[] csvheaders = File.ReadLines(csvfile).First().ToLowerInvariant().Split(','); @@ -363,7 +354,7 @@ return csvheaders; } - static void GetCatalogItemPictures(string contentRootPath, string picturePath) + private void GetCatalogItemPictures(string contentRootPath, string picturePath) { DirectoryInfo directory = new DirectoryInfo(picturePath); foreach (FileInfo file in directory.GetFiles()) @@ -374,7 +365,18 @@ string zipFileCatalogItemPictures = Path.Combine(contentRootPath, "Setup", "CatalogItems.zip"); ZipFile.ExtractToDirectory(zipFileCatalogItemPictures, picturePath); } - } - + private Policy CreatePolicy( ILogger logger, string prefix,int retries = 3) + { + return Policy.Handle(). + WaitAndRetryAsync( + retryCount: retries, + sleepDurationProvider: retry => TimeSpan.FromSeconds(5), + onRetry: (exception, timeSpan, retry, ctx) => + { + logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); + } + ); + } + } } diff --git a/src/Services/Catalog/Catalog.API/Program.cs b/src/Services/Catalog/Catalog.API/Program.cs index 2de3600b9..1eeeeb5ec 100644 --- a/src/Services/Catalog/Catalog.API/Program.cs +++ b/src/Services/Catalog/Catalog.API/Program.cs @@ -1,15 +1,31 @@ using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; +using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF; +using Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using System.IO; - namespace Microsoft.eShopOnContainers.Services.Catalog.API { public class Program { public static void Main(string[] args) { - BuildWebHost(args).Run(); + BuildWebHost(args) + .MigrateDbContext((context,services)=> + { + var env = services.GetService(); + var settings = services.GetService>(); + var logger = services.GetService>(); + + new CatalogContextSeed() + .SeedAsync(context,env,settings,logger) + .Wait(); + + }) + .MigrateDbContext((_,__)=> { }) + .Run(); } public static IWebHost BuildWebHost(string[] args) => diff --git a/src/Services/Catalog/Catalog.API/Startup.cs b/src/Services/Catalog/Catalog.API/Startup.cs index 21b9ae1c8..8bfa347d2 100644 --- a/src/Services/Catalog/Catalog.API/Startup.cs +++ b/src/Services/Catalog/Catalog.API/Startup.cs @@ -9,7 +9,6 @@ using Microsoft.Azure.ServiceBus; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; - using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; @@ -24,15 +23,10 @@ using Microsoft.Extensions.HealthChecks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; - using Microsoft.WindowsAzure.Storage; - using Microsoft.WindowsAzure.Storage.Auth; - using Polly; using RabbitMQ.Client; using System; using System.Data.Common; - using System.Data.SqlClient; using System.Reflection; - using System.Threading.Tasks; public class Startup { @@ -85,6 +79,13 @@ //Check Client vs. Server evaluation: https://docs.microsoft.com/en-us/ef/core/querying/client-eval }); + services.AddDbContext(options => + { + options.UseSqlServer(Configuration["ConnectionString"], opts => + opts.MigrationsAssembly("Catalog.API")); + }); + + services.Configure(Configuration); // Add framework services. @@ -184,43 +185,7 @@ c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); - var context = (CatalogContext)app - .ApplicationServices.GetService(typeof(CatalogContext)); - - WaitForSqlAvailabilityAsync(context, loggerFactory, app, env).Wait(); - ConfigureEventBus(app); - - var integrationEventLogContext = new IntegrationEventLogContext( - new DbContextOptionsBuilder() - .UseSqlServer(Configuration["ConnectionString"], b => b.MigrationsAssembly("Catalog.API")) - .Options); - - integrationEventLogContext.Database.Migrate(); - } - - private async Task WaitForSqlAvailabilityAsync(CatalogContext ctx, ILoggerFactory loggerFactory, IApplicationBuilder app, IHostingEnvironment env, int retries = 0) - { - var logger = loggerFactory.CreateLogger(nameof(Startup)); - var policy = CreatePolicy(retries, logger, nameof(WaitForSqlAvailabilityAsync)); - await policy.ExecuteAsync(async () => - { - await CatalogContextSeed.SeedAsync(app, env, loggerFactory); - }); - - } - - private Policy CreatePolicy(int retries, ILogger logger, string prefix) - { - return Policy.Handle(). - WaitAndRetryAsync( - retryCount: retries, - sleepDurationProvider: retry => TimeSpan.FromSeconds(5), - onRetry: (exception, timeSpan, retry, ctx) => - { - logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); - } - ); } private void RegisterEventBus(IServiceCollection services) diff --git a/src/Services/Identity/Identity.API/AppSettings.cs b/src/Services/Identity/Identity.API/AppSettings.cs index 78d848d41..1f45763fe 100644 --- a/src/Services/Identity/Identity.API/AppSettings.cs +++ b/src/Services/Identity/Identity.API/AppSettings.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace eShopOnContainers.Identity +namespace Microsoft.eShopOnContainers.Services.Identity.API { public class AppSettings { public string MvcClient { get; set; } + public bool UseCustomizationData { get; set; } } } diff --git a/src/Services/Identity/Identity.API/Certificate/Certificate.cs b/src/Services/Identity/Identity.API/Certificate/Certificate.cs index f779017fe..d20726d12 100644 --- a/src/Services/Identity/Identity.API/Certificate/Certificate.cs +++ b/src/Services/Identity/Identity.API/Certificate/Certificate.cs @@ -1,11 +1,8 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -using System.IO; +using System.IO; using System.Reflection; using System.Security.Cryptography.X509Certificates; -namespace Identity.API.Certificate +namespace Microsoft.eShopOnContainers.Services.Identity.API.Certificates { static class Certificate { diff --git a/src/Services/Identity/Identity.API/Configuration/Config.cs b/src/Services/Identity/Identity.API/Configuration/Config.cs index 89d5c0dc7..969b86aa1 100644 --- a/src/Services/Identity/Identity.API/Configuration/Config.cs +++ b/src/Services/Identity/Identity.API/Configuration/Config.cs @@ -2,7 +2,7 @@ using IdentityServer4.Models; using System.Collections.Generic; -namespace Identity.API.Configuration +namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration { public class Config { diff --git a/src/Services/Identity/Identity.API/Controllers/AccountController.cs b/src/Services/Identity/Identity.API/Controllers/AccountController.cs index 51e582ed7..79e9c247e 100644 --- a/src/Services/Identity/Identity.API/Controllers/AccountController.cs +++ b/src/Services/Identity/Identity.API/Controllers/AccountController.cs @@ -1,11 +1,5 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -using Identity.API.Models; -using Identity.API.Models.AccountViewModels; -using Identity.API.Services; -using IdentityModel; +using IdentityModel; +using IdentityServer4; using IdentityServer4.Models; using IdentityServer4.Services; using IdentityServer4.Stores; @@ -13,6 +7,9 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; +using Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels; +using Microsoft.eShopOnContainers.Services.Identity.API.Services; using Microsoft.Extensions.Logging; using System; using System.Linq; @@ -20,7 +17,7 @@ using System.Security.Claims; using System.Text.Encodings.Web; using System.Threading.Tasks; -namespace IdentityServer4.Quickstart.UI.Controllers +namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers { /// /// This sample controller implements a typical login/logout/provision workflow for local and external accounts. diff --git a/src/Services/Identity/Identity.API/Controllers/ConsentController.cs b/src/Services/Identity/Identity.API/Controllers/ConsentController.cs index a5687dd31..095440d6b 100644 --- a/src/Services/Identity/Identity.API/Controllers/ConsentController.cs +++ b/src/Services/Identity/Identity.API/Controllers/ConsentController.cs @@ -1,19 +1,13 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - +using IdentityServer4.Models; using IdentityServer4.Services; +using IdentityServer4.Stores; using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels; using Microsoft.Extensions.Logging; using System.Linq; using System.Threading.Tasks; -using IdentityServer4.Models; -using IdentityServer4.Stores; -using IdentityServer4.Quickstart.UI.Models; -using Identity.API.Models.AccountViewModels; -using Identity.API.Services; -namespace IdentityServer4.Quickstart.UI.Controllers +namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers { /// /// This controller implements the consent logic diff --git a/src/Services/Identity/Identity.API/Controllers/HomeController.cs b/src/Services/Identity/Identity.API/Controllers/HomeController.cs index f21ab65e0..66931b764 100644 --- a/src/Services/Identity/Identity.API/Controllers/HomeController.cs +++ b/src/Services/Identity/Identity.API/Controllers/HomeController.cs @@ -1,16 +1,12 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -using eShopOnContainers.Identity; -using Identity.API.Services; -using IdentityServer4.Quickstart.UI.Models; + using IdentityServer4.Services; using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; +using Microsoft.eShopOnContainers.Services.Identity.API.Services; using Microsoft.Extensions.Options; using System.Threading.Tasks; -namespace IdentityServer4.Quickstart.UI.Controllers +namespace Microsoft.eShopOnContainers.Services.Identity.API.Controllers { public class HomeController : Controller { diff --git a/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs b/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs index bbbe04962..aec67258c 100644 --- a/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs +++ b/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs @@ -1,8 +1,8 @@ -using Identity.API.Models; -using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; -namespace Identity.API.Data +namespace Microsoft.eShopOnContainers.Services.Identity.API.Data { public class ApplicationDbContext : IdentityDbContext { diff --git a/src/Services/Identity/Identity.API/Data/ApplicationContextSeed.cs b/src/Services/Identity/Identity.API/Data/ApplicationDbContextSeed.cs similarity index 77% rename from src/Services/Identity/Identity.API/Data/ApplicationContextSeed.cs rename to src/Services/Identity/Identity.API/Data/ApplicationDbContextSeed.cs index d0099cc21..3dbf28171 100644 --- a/src/Services/Identity/Identity.API/Data/ApplicationContextSeed.cs +++ b/src/Services/Identity/Identity.API/Data/ApplicationDbContextSeed.cs @@ -1,56 +1,40 @@ -namespace Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Identity; +using Microsoft.eShopOnContainers.Services.Identity.API.Extensions; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Services.Identity.API.Data { - using AspNetCore.Identity; - using EntityFrameworkCore; - using Extensions.Logging; - using global::eShopOnContainers.Identity; - using global::Identity.API.Data; - using global::Identity.API.Extensions; - using global::Identity.API.Models; - using Microsoft.AspNetCore.Builder; - using Microsoft.AspNetCore.Hosting; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.Options; - using System; - using System.Collections.Generic; - using System.IO; - using System.IO.Compression; - using System.Linq; - using System.Text.RegularExpressions; - using System.Threading.Tasks; - - public class ApplicationContextSeed - { - private readonly IPasswordHasher _passwordHasher; - public ApplicationContextSeed(IPasswordHasher passwordHasher) - { - _passwordHasher = passwordHasher; - } - public async Task SeedAsync(IApplicationBuilder applicationBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory, int? retry = 0) + public class ApplicationDbContextSeed + { + private readonly IPasswordHasher _passwordHasher = new PasswordHasher(); + + public async Task SeedAsync(ApplicationDbContext context,IHostingEnvironment env, + ILogger logger, IOptions settings,int? retry = 0) { int retryForAvaiability = retry.Value; + try { - var log = loggerFactory.CreateLogger("application seed"); - - var context = (ApplicationDbContext)applicationBuilder - .ApplicationServices.GetService(typeof(ApplicationDbContext)); - - context.Database.Migrate(); - - var settings = (AppSettings)applicationBuilder - .ApplicationServices.GetRequiredService>().Value; - - var useCustomizationData = settings.UseCustomizationData; + var useCustomizationData = settings.Value.UseCustomizationData; var contentRootPath = env.ContentRootPath; var webroot = env.WebRootPath; if (!context.Users.Any()) { context.Users.AddRange(useCustomizationData - ? GetUsersFromFile(contentRootPath, log) + ? GetUsersFromFile(contentRootPath, logger) : GetDefaultUser()); await context.SaveChangesAsync(); @@ -58,7 +42,7 @@ if (useCustomizationData) { - GetPreconfiguredImages(contentRootPath, webroot, log); + GetPreconfiguredImages(contentRootPath, webroot, logger); } } catch (Exception ex) @@ -66,14 +50,15 @@ if (retryForAvaiability < 10) { retryForAvaiability++; - var log = loggerFactory.CreateLogger("catalog seed"); - log.LogError(ex.Message); - await SeedAsync(applicationBuilder, env, loggerFactory, retryForAvaiability); + + logger.LogError(ex.Message,$"There is an error migrating data for ApplicationDbContext"); + + await SeedAsync(context,env,logger,settings, retryForAvaiability); } } } - private IEnumerable GetUsersFromFile(string contentRootPath, ILogger log) + private IEnumerable GetUsersFromFile(string contentRootPath, ILogger logger) { string csvFileUsers = Path.Combine(contentRootPath, "Setup", "Users.csv"); @@ -95,7 +80,8 @@ } catch (Exception ex) { - log.LogError(ex.Message); + logger.LogError(ex.Message); + return GetDefaultUser(); } @@ -103,7 +89,7 @@ .Skip(1) // skip header column .Select(row => Regex.Split(row, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") ) .SelectTry(column => CreateApplicationUser(column, csvheaders)) - .OnCaughtException(ex => { log.LogError(ex.Message); return null; }) + .OnCaughtException(ex => { logger.LogError(ex.Message); return null; }) .Where(x => x != null) .ToList(); @@ -206,14 +192,14 @@ return csvheaders; } - static void GetPreconfiguredImages(string contentRootPath, string webroot, ILogger log) + static void GetPreconfiguredImages(string contentRootPath, string webroot, ILogger logger) { try { string imagesZipFile = Path.Combine(contentRootPath, "Setup", "images.zip"); if (!File.Exists(imagesZipFile)) { - log.LogError($" zip file '{imagesZipFile}' does not exists."); + logger.LogError($" zip file '{imagesZipFile}' does not exists."); return; } @@ -235,14 +221,14 @@ } else { - log.LogWarning($"Skip file '{entry.Name}' in zipfile '{imagesZipFile}'"); + logger.LogWarning($"Skip file '{entry.Name}' in zipfile '{imagesZipFile}'"); } } } } catch (Exception ex) { - log.LogError($"Exception in method GetPreconfiguredImages WebMVC. Exception Message={ex.Message}"); + logger.LogError($"Exception in method GetPreconfiguredImages WebMVC. Exception Message={ex.Message}"); } } } diff --git a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs new file mode 100644 index 000000000..bb41f0d0a --- /dev/null +++ b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs @@ -0,0 +1,56 @@ +using IdentityServer4.EntityFramework.DbContexts; +using IdentityServer4.EntityFramework.Mappers; +using Microsoft.eShopOnContainers.Services.Identity.API.Configuration; +using Microsoft.Extensions.Configuration; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Services.Identity.API.Data +{ + public class ConfigurationDbContextSeed + { + public async Task SeedAsync(ConfigurationDbContext context,IConfiguration configuration) + { + + //callbacks urls from config: + var clientUrls = new Dictionary(); + + clientUrls.Add("Mvc", configuration.GetValue("MvcClient")); + clientUrls.Add("Spa", configuration.GetValue("SpaClient")); + clientUrls.Add("Xamarin", configuration.GetValue("XamarinCallback")); + clientUrls.Add("LocationsApi", configuration.GetValue("LocationApiClient")); + clientUrls.Add("MarketingApi", configuration.GetValue("MarketingApiClient")); + clientUrls.Add("BasketApi", configuration.GetValue("BasketApiClient")); + clientUrls.Add("OrderingApi", configuration.GetValue("OrderingApiClient")); + + if (!context.Clients.Any()) + { + foreach (var client in Config.GetClients(clientUrls)) + { + await context.Clients.AddAsync(client.ToEntity()); + } + await context.SaveChangesAsync(); + } + + if (!context.IdentityResources.Any()) + { + foreach (var resource in Config.GetResources()) + { + await context.IdentityResources.AddAsync(resource.ToEntity()); + } + await context.SaveChangesAsync(); + } + + if (!context.ApiResources.Any()) + { + foreach (var api in Config.GetApis()) + { + await context.ApiResources.AddAsync(api.ToEntity()); + } + + await context.SaveChangesAsync(); + } + } + } +} diff --git a/src/Services/Identity/Identity.API/Extensions/LinqSelectExtensions.cs b/src/Services/Identity/Identity.API/Extensions/LinqSelectExtensions.cs index e3ff0a3c0..1061881af 100644 --- a/src/Services/Identity/Identity.API/Extensions/LinqSelectExtensions.cs +++ b/src/Services/Identity/Identity.API/Extensions/LinqSelectExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; -namespace Identity.API.Extensions +namespace Microsoft.eShopOnContainers.Services.Identity.API.Extensions { public static class LinqSelectExtensions { diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index ae6aab44b..cee95b94f 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -43,6 +43,7 @@ + diff --git a/src/Services/Identity/Identity.API/Migrations/20170912114036_Initial.Designer.cs b/src/Services/Identity/Identity.API/Migrations/20170912114036_Initial.Designer.cs index 59f056335..0850b37b9 100644 --- a/src/Services/Identity/Identity.API/Migrations/20170912114036_Initial.Designer.cs +++ b/src/Services/Identity/Identity.API/Migrations/20170912114036_Initial.Designer.cs @@ -1,11 +1,9 @@ // -using Identity.API.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; +using Microsoft.eShopOnContainers.Services.Identity.API.Data; using System; namespace Identity.API.Migrations diff --git a/src/Services/Identity/Identity.API/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Services/Identity/Identity.API/Migrations/ApplicationDbContextModelSnapshot.cs index ff7e60e21..dcc87bc73 100644 --- a/src/Services/Identity/Identity.API/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Services/Identity/Identity.API/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1,11 +1,8 @@ // -using Identity.API.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; +using Microsoft.eShopOnContainers.Services.Identity.API.Data; using System; namespace Identity.API.Migrations diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentInputModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentInputModel.cs index 89a2d90e7..633f37b89 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentInputModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentInputModel.cs @@ -1,10 +1,6 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. +using System.Collections.Generic; - -using System.Collections.Generic; - -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class ConsentInputModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentViewModel.cs index e0df65555..c010f636f 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/ConsentViewModel.cs @@ -1,12 +1,10 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - + using System.Collections.Generic; using System.Linq; using IdentityServer4.Models; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class ConsentViewModel : ConsentInputModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/ExternalLoginConfirmationViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/ExternalLoginConfirmationViewModel.cs index 526f320ba..5d4f597a2 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/ExternalLoginConfirmationViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/ExternalLoginConfirmationViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class ExternalLoginConfirmationViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs index fd00ca55f..f5dd3ab61 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class ForgotPasswordViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs index d78c9e984..bd7f7c7bb 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs @@ -1,8 +1,4 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class LoggedOutViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/LoginViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/LoginViewModel.cs index edb29a8d2..3b1926cc2 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/LoginViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/LoginViewModel.cs @@ -1,10 +1,6 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. +using System.ComponentModel.DataAnnotations; - -using System.ComponentModel.DataAnnotations; - -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class LoginViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/LogoutViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/LogoutViewModel.cs index fd5153288..d81dcd6ac 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/LogoutViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/LogoutViewModel.cs @@ -1,8 +1,4 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class LogoutViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/RegisterViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/RegisterViewModel.cs index c84c1478d..df97bb965 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/RegisterViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/RegisterViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class RegisterViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs index a90c4ca64..57edc44c3 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class ResetPasswordViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs index b5efaed34..a6f316c48 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs @@ -1,10 +1,7 @@ -using System; +using Microsoft.AspNetCore.Mvc.Rendering; using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Rendering; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class SendCodeViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs index f0a18d663..83d075f9c 100644 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.AccountViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels { public class VerifyCodeViewModel { diff --git a/src/Services/Identity/Identity.API/Models/AccountViewModels/_LoginViewModel.cs b/src/Services/Identity/Identity.API/Models/AccountViewModels/_LoginViewModel.cs deleted file mode 100644 index 63290cb8a..000000000 --- a/src/Services/Identity/Identity.API/Models/AccountViewModels/_LoginViewModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -using System.Collections.Generic; - -namespace Identity.API.Models.AccountViewModels -{ - //public class _LoginViewModel : LoginViewModel - //{ - // public bool EnableLocalLogin { get; set; } - // public IEnumerable ExternalProviders { get; set; } - //} - - //public class ExternalProvider - //{ - // public string DisplayName { get; set; } - // public string AuthenticationScheme { get; set; } - //} -} \ No newline at end of file diff --git a/src/Services/Identity/Identity.API/Models/ApplicationUser.cs b/src/Services/Identity/Identity.API/Models/ApplicationUser.cs index 1c1f7bda1..fa43017fc 100644 --- a/src/Services/Identity/Identity.API/Models/ApplicationUser.cs +++ b/src/Services/Identity/Identity.API/Models/ApplicationUser.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Identity; using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models { // Add profile data for application users by adding properties to the ApplicationUser class public class ApplicationUser : IdentityUser diff --git a/src/Services/Identity/Identity.API/Models/ErrorViewModel.cs b/src/Services/Identity/Identity.API/Models/ErrorViewModel.cs index 379377aec..b101bca7a 100644 --- a/src/Services/Identity/Identity.API/Models/ErrorViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ErrorViewModel.cs @@ -4,7 +4,7 @@ using IdentityServer4.Models; -namespace IdentityServer4.Quickstart.UI.Models +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models { public class ErrorViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs index ada4b8a03..2a1cc49d0 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class AddPhoneNumberViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs index b0df1b2af..fa9193c38 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class ChangePasswordViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs index 5ed3b2925..15cf719fa 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs @@ -1,10 +1,7 @@ -using System; +using Microsoft.AspNetCore.Mvc.Rendering; using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Rendering; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class ConfigureTwoFactorViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/FactorViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/FactorViewModel.cs index 92eccf504..4a6d4497f 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/FactorViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/FactorViewModel.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class FactorViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/IndexViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/IndexViewModel.cs index f6e5b6874..b13bc18e3 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/IndexViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/IndexViewModel.cs @@ -1,10 +1,7 @@ -using System; +using Microsoft.AspNetCore.Identity; using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Identity; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class IndexViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/ManageLoginsViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/ManageLoginsViewModel.cs index 1238585cd..0b24c3b7c 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/ManageLoginsViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/ManageLoginsViewModel.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Authentication; +using Microsoft.AspNetCore.Http.Authentication; using Microsoft.AspNetCore.Identity; +using System.Collections.Generic; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class ManageLoginsViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/RemoveLoginViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/RemoveLoginViewModel.cs index 546f0b1e8..c9171fcf3 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/RemoveLoginViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/RemoveLoginViewModel.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; - -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class RemoveLoginViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs index d824afc94..9d0711b08 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class SetPasswordViewModel { diff --git a/src/Services/Identity/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs b/src/Services/Identity/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs index af7105a2e..fccf56e4e 100644 --- a/src/Services/Identity/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs +++ b/src/Services/Identity/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; -namespace Identity.API.Models.ManageViewModels +namespace Microsoft.eShopOnContainers.Services.Identity.API.Models.ManageViewModels { public class VerifyPhoneNumberViewModel { diff --git a/src/Services/Identity/Identity.API/Program.cs b/src/Services/Identity/Identity.API/Program.cs index 9802c36f1..0b32b4549 100644 --- a/src/Services/Identity/Identity.API/Program.cs +++ b/src/Services/Identity/Identity.API/Program.cs @@ -1,16 +1,39 @@ -using Microsoft.AspNetCore; +using IdentityServer4.EntityFramework.DbContexts; +using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; -using Microsoft.eShopOnContainers.Services.Identity; +using Microsoft.eShopOnContainers.Services.Identity.API.Data; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using System.IO; -namespace eShopOnContainers.Identity +namespace Microsoft.eShopOnContainers.Services.Identity.API { public class Program { public static void Main(string[] args) { - BuildWebHost(args).Run(); + BuildWebHost(args) + .MigrateDbContext((_, __) => { }) + .MigrateDbContext((context, services) => + { + var env = services.GetService(); + var logger = services.GetService>(); + var settings = services.GetService>(); + + new ApplicationDbContextSeed() + .SeedAsync(context, env, logger, settings) + .Wait(); + }) + .MigrateDbContext((context,services)=> + { + var configuration = services.GetService(); + + new ConfigurationDbContextSeed() + .SeedAsync(context, configuration) + .Wait(); + }).Run(); } public static IWebHost BuildWebHost(string[] args) => diff --git a/src/Services/Identity/Identity.API/Services/EFLoginService.cs b/src/Services/Identity/Identity.API/Services/EFLoginService.cs index e1c2fe52e..63c4d4b7e 100644 --- a/src/Services/Identity/Identity.API/Services/EFLoginService.cs +++ b/src/Services/Identity/Identity.API/Services/EFLoginService.cs @@ -1,11 +1,8 @@ -using Identity.API.Models; -using Microsoft.AspNetCore.Identity; -using System; -using System.Collections.Generic; -using System.Linq; +using Microsoft.AspNetCore.Identity; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; using System.Threading.Tasks; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public class EFLoginService : ILoginService { diff --git a/src/Services/Identity/Identity.API/Services/IEmailSender.cs b/src/Services/Identity/Identity.API/Services/IEmailSender.cs index 2259641f8..95a4f99ee 100644 --- a/src/Services/Identity/Identity.API/Services/IEmailSender.cs +++ b/src/Services/Identity/Identity.API/Services/IEmailSender.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public interface IEmailSender { diff --git a/src/Services/Identity/Identity.API/Services/ILoginService.cs b/src/Services/Identity/Identity.API/Services/ILoginService.cs index 5915b42ee..7bff7f272 100644 --- a/src/Services/Identity/Identity.API/Services/ILoginService.cs +++ b/src/Services/Identity/Identity.API/Services/ILoginService.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public interface ILoginService { diff --git a/src/Services/Identity/Identity.API/Services/IRedirectService.cs b/src/Services/Identity/Identity.API/Services/IRedirectService.cs index 9dd277e2d..4ec8ea1fc 100644 --- a/src/Services/Identity/Identity.API/Services/IRedirectService.cs +++ b/src/Services/Identity/Identity.API/Services/IRedirectService.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public interface IRedirectService { diff --git a/src/Services/Identity/Identity.API/Services/ISmsSender.cs b/src/Services/Identity/Identity.API/Services/ISmsSender.cs index 5c6bd2aae..f842e7ae9 100644 --- a/src/Services/Identity/Identity.API/Services/ISmsSender.cs +++ b/src/Services/Identity/Identity.API/Services/ISmsSender.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public interface ISmsSender { diff --git a/src/Services/Identity/Identity.API/Services/MessageServices.cs b/src/Services/Identity/Identity.API/Services/MessageServices.cs index d9898cba4..18ab35a7c 100644 --- a/src/Services/Identity/Identity.API/Services/MessageServices.cs +++ b/src/Services/Identity/Identity.API/Services/MessageServices.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { // This class is used by the application to send Email and SMS // when you turn on two-factor authentication in ASP.NET Identity. diff --git a/src/Services/Identity/Identity.API/Services/ProfileService.cs b/src/Services/Identity/Identity.API/Services/ProfileService.cs index 71d10a777..204ac3119 100644 --- a/src/Services/Identity/Identity.API/Services/ProfileService.cs +++ b/src/Services/Identity/Identity.API/Services/ProfileService.cs @@ -1,15 +1,15 @@ -using IdentityServer4.Services; +using IdentityModel; +using IdentityServer4.Models; +using IdentityServer4.Services; +using Microsoft.AspNetCore.Identity; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; -using IdentityServer4.Models; -using Microsoft.AspNetCore.Identity; -using Identity.API.Models; using System.Security.Claims; -using IdentityModel; +using System.Threading.Tasks; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public class ProfileService : IProfileService { diff --git a/src/Services/Identity/Identity.API/Services/RedirectService.cs b/src/Services/Identity/Identity.API/Services/RedirectService.cs index 440272d39..bbe0ae976 100644 --- a/src/Services/Identity/Identity.API/Services/RedirectService.cs +++ b/src/Services/Identity/Identity.API/Services/RedirectService.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading.Tasks; +using System.Text.RegularExpressions; -namespace Identity.API.Services +namespace Microsoft.eShopOnContainers.Services.Identity.API.Services { public class RedirectService : IRedirectService { diff --git a/src/Services/Identity/Identity.API/Startup.cs b/src/Services/Identity/Identity.API/Startup.cs index 572e0399f..dccfe277e 100644 --- a/src/Services/Identity/Identity.API/Startup.cs +++ b/src/Services/Identity/Identity.API/Startup.cs @@ -1,31 +1,23 @@ using Autofac; using Autofac.Extensions.DependencyInjection; -using eShopOnContainers.Identity; -using Identity.API.Certificate; -using Identity.API.Configuration; -using Identity.API.Data; -using Identity.API.Models; -using Identity.API.Services; -using IdentityServer4.EntityFramework.DbContexts; -using IdentityServer4.EntityFramework.Mappers; using IdentityServer4.Services; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.eShopOnContainers.BuildingBlocks; -using Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure; +using Microsoft.eShopOnContainers.Services.Identity.API.Certificates; +using Microsoft.eShopOnContainers.Services.Identity.API.Data; +using Microsoft.eShopOnContainers.Services.Identity.API.Models; +using Microsoft.eShopOnContainers.Services.Identity.API.Services; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.HealthChecks; using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; -using System.Linq; using System.Reflection; -using System.Threading.Tasks; -namespace Microsoft.eShopOnContainers.Services.Identity +namespace Microsoft.eShopOnContainers.Services.Identity.API { public class Startup { @@ -39,7 +31,6 @@ namespace Microsoft.eShopOnContainers.Services.Identity // This method gets called by the runtime. Use this method to add services to the container. public IServiceProvider ConfigureServices(IServiceCollection services) { - // Add framework services. services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); @@ -145,63 +136,6 @@ namespace Microsoft.eShopOnContainers.Services.Identity name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); - - // Store idsrv grant config into db - InitializeGrantStoreAndConfiguration(app).Wait(); - - //Seed Data - var hasher = new PasswordHasher(); - new ApplicationContextSeed(hasher).SeedAsync(app, env, loggerFactory).Wait(); - } - - private async Task InitializeGrantStoreAndConfiguration(IApplicationBuilder app) - { - //callbacks urls from config: - Dictionary clientUrls = new Dictionary(); - clientUrls.Add("Mvc", Configuration.GetValue("MvcClient")); - clientUrls.Add("Spa", Configuration.GetValue("SpaClient")); - clientUrls.Add("Xamarin", Configuration.GetValue("XamarinCallback")); - clientUrls.Add("LocationsApi", Configuration.GetValue("LocationApiClient")); - clientUrls.Add("MarketingApi", Configuration.GetValue("MarketingApiClient")); - clientUrls.Add("BasketApi", Configuration.GetValue("BasketApiClient")); - clientUrls.Add("OrderingApi", Configuration.GetValue("OrderingApiClient")); - - using (var serviceScope = app.ApplicationServices.GetService().CreateScope()) - { - serviceScope.ServiceProvider.GetRequiredService() - .Database - .Migrate(); - - var context = serviceScope.ServiceProvider.GetRequiredService(); - context.Database.Migrate(); - - if (!context.Clients.Any()) - { - foreach (var client in Config.GetClients(clientUrls)) - { - await context.Clients.AddAsync(client.ToEntity()); - } - await context.SaveChangesAsync(); - } - - if (!context.IdentityResources.Any()) - { - foreach (var resource in Config.GetResources()) - { - await context.IdentityResources.AddAsync(resource.ToEntity()); - } - await context.SaveChangesAsync(); - } - - if (!context.ApiResources.Any()) - { - foreach (var api in Config.GetApis()) - { - await context.ApiResources.AddAsync(api.ToEntity()); - } - await context.SaveChangesAsync(); - } - } } } } diff --git a/src/Services/Marketing/Marketing.API/Infrastructure/MarketingContextSeed.cs b/src/Services/Marketing/Marketing.API/Infrastructure/MarketingContextSeed.cs index ecb3f3c80..6396d3f5d 100644 --- a/src/Services/Marketing/Marketing.API/Infrastructure/MarketingContextSeed.cs +++ b/src/Services/Marketing/Marketing.API/Infrastructure/MarketingContextSeed.cs @@ -1,33 +1,33 @@ namespace Microsoft.eShopOnContainers.Services.Marketing.API.Infrastructure { - using Microsoft.AspNetCore.Builder; - using Microsoft.EntityFrameworkCore; using Microsoft.eShopOnContainers.Services.Marketing.API.Model; using Microsoft.Extensions.Logging; + using Polly; using System; using System.Collections.Generic; + using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; - public static class MarketingContextSeed + public class MarketingContextSeed { - public static async Task SeedAsync(IApplicationBuilder applicationBuilder, ILoggerFactory loggerFactory, int? retry = 0) + public async Task SeedAsync(MarketingContext context,ILogger logger,int retries = 3) { - var context = (MarketingContext)applicationBuilder - .ApplicationServices.GetService(typeof(MarketingContext)); + var policy = CreatePolicy(retries, logger, nameof(MarketingContextSeed)); - context.Database.Migrate(); - - if (!context.Campaigns.Any()) + await policy.ExecuteAsync(async () => { - context.Campaigns.AddRange( - GetPreconfiguredMarketings()); + if (!context.Campaigns.Any()) + { + context.Campaigns.AddRange( + GetPreconfiguredMarketings()); - await context.SaveChangesAsync(); - } + await context.SaveChangesAsync(); + } + }); } - static List GetPreconfiguredMarketings() + private List GetPreconfiguredMarketings() { return new List { @@ -67,5 +67,18 @@ } }; } + + private Policy CreatePolicy(int retries, ILogger logger, string prefix) + { + return Policy.Handle(). + WaitAndRetryAsync( + retryCount: retries, + sleepDurationProvider: retry => TimeSpan.FromSeconds(5), + onRetry: (exception, timeSpan, retry, ctx) => + { + logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); + } + ); + } } } diff --git a/src/Services/Marketing/Marketing.API/Infrastructure/MarketingReadDataContext.cs b/src/Services/Marketing/Marketing.API/Infrastructure/MarketingReadDataContext.cs index 5790acf09..b16968617 100644 --- a/src/Services/Marketing/Marketing.API/Infrastructure/MarketingReadDataContext.cs +++ b/src/Services/Marketing/Marketing.API/Infrastructure/MarketingReadDataContext.cs @@ -11,8 +11,11 @@ public MarketingReadDataContext(IOptions settings) { var client = new MongoClient(settings.Value.MongoConnectionString); + if (client != null) + { _database = client.GetDatabase(settings.Value.MongoDatabase); + } } public IMongoCollection MarketingData diff --git a/src/Services/Marketing/Marketing.API/Marketing.API.csproj b/src/Services/Marketing/Marketing.API/Marketing.API.csproj index b834eab2d..2afba2204 100644 --- a/src/Services/Marketing/Marketing.API/Marketing.API.csproj +++ b/src/Services/Marketing/Marketing.API/Marketing.API.csproj @@ -34,6 +34,7 @@ + diff --git a/src/Services/Marketing/Marketing.API/Program.cs b/src/Services/Marketing/Marketing.API/Program.cs index 197573518..32852073c 100644 --- a/src/Services/Marketing/Marketing.API/Program.cs +++ b/src/Services/Marketing/Marketing.API/Program.cs @@ -2,6 +2,8 @@ { using AspNetCore.Hosting; using Microsoft.AspNetCore; + using Microsoft.eShopOnContainers.Services.Marketing.API.Infrastructure; + using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.IO; @@ -9,7 +11,16 @@ { public static void Main(string[] args) { - BuildWebHost(args).Run(); + BuildWebHost(args) + .MigrateDbContext((context, services) => + { + var logger = services.GetService>(); + + new MarketingContextSeed() + .SeedAsync(context,logger) + .Wait(); + + }).Run(); } public static IWebHost BuildWebHost(string[] args) => diff --git a/src/Services/Marketing/Marketing.API/Startup.cs b/src/Services/Marketing/Marketing.API/Startup.cs index bac62095f..d8db51682 100644 --- a/src/Services/Marketing/Marketing.API/Startup.cs +++ b/src/Services/Marketing/Marketing.API/Startup.cs @@ -22,12 +22,10 @@ using IntegrationEvents.Events; using Marketing.API.IntegrationEvents.Handlers; using Microsoft.EntityFrameworkCore.Diagnostics; - using Polly; using RabbitMQ.Client; using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; - using System.Data.SqlClient; using System.IdentityModel.Tokens.Jwt; using System.Reflection; using System.Threading.Tasks; @@ -174,6 +172,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory) { var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) { app.UsePathBase(pathBase); @@ -192,11 +191,6 @@ c.ConfigureOAuth2("marketingswaggerui", "", "", "Marketing Swagger UI"); }); - var context = (MarketingContext)app - .ApplicationServices.GetService(typeof(MarketingContext)); - - WaitForSqlAvailabilityAsync(context, loggerFactory, app).Wait(); - ConfigureEventBus(app); } @@ -249,28 +243,5 @@ { app.UseAuthentication(); } - - private async Task WaitForSqlAvailabilityAsync(MarketingContext ctx, ILoggerFactory loggerFactory, IApplicationBuilder app, int retries = 0) - { - var logger = loggerFactory.CreateLogger(nameof(Startup)); - var policy = CreatePolicy(retries, logger, nameof(WaitForSqlAvailabilityAsync)); - await policy.ExecuteAsync(async () => - { - await MarketingContextSeed.SeedAsync(app, loggerFactory); - }); - } - - private Policy CreatePolicy(int retries, ILogger logger, string prefix) - { - return Policy.Handle(). - WaitAndRetryAsync( - retryCount: retries, - sleepDurationProvider: retry => TimeSpan.FromSeconds(5), - onRetry: (exception, timeSpan, retry, ctx) => - { - logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); - } - ); - } } } diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs b/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs index 7443024ee..53c53f052 100644 --- a/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs +++ b/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs @@ -1,63 +1,64 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure { using AspNetCore.Builder; + using global::Ordering.API.Extensions; + using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; - using Microsoft.eShopOnContainers.Services.Ordering.Domain; - using Ordering.Infrastructure; - using System.Linq; - using System.Threading.Tasks; using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate; using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; - using System.Collections.Generic; - using Microsoft.AspNetCore.Hosting; - using System.IO; - using Microsoft.Extensions.Options; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Options; + using Ordering.Infrastructure; + using Polly; using System; - using global::Ordering.API.Extensions; + using System.Collections.Generic; + using System.Data.SqlClient; + using System.IO; + using System.Linq; + using System.Threading.Tasks; public class OrderingContextSeed { - public static async Task SeedAsync(IApplicationBuilder applicationBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory) + public async Task SeedAsync(OrderingContext context, IHostingEnvironment env,IOptions settings, ILogger logger) { - var log = loggerFactory.CreateLogger("ordering seed"); + var policy = CreatePolicy(logger, nameof(OrderingContextSeed)); - var context = (OrderingContext)applicationBuilder - .ApplicationServices.GetService(typeof(OrderingContext)); - - var settings = applicationBuilder - .ApplicationServices.GetRequiredService>().Value; + await policy.ExecuteAsync(async () => + { - var useCustomizationData = settings.UseCustomizationData; - var contentRootPath = env.ContentRootPath; + var useCustomizationData = settings.Value + .UseCustomizationData; + var contentRootPath = env.ContentRootPath; - using (context) - { - context.Database.Migrate(); - if (!context.CardTypes.Any()) + using (context) { - context.CardTypes.AddRange(useCustomizationData - ? GetCardTypesFromFile(contentRootPath, log) - : GetPredefinedCardTypes()); + context.Database.Migrate(); - await context.SaveChangesAsync(); - } + if (!context.CardTypes.Any()) + { + context.CardTypes.AddRange(useCustomizationData + ? GetCardTypesFromFile(contentRootPath, logger) + : GetPredefinedCardTypes()); - if (!context.OrderStatus.Any()) - { - context.OrderStatus.AddRange(useCustomizationData - ? GetOrderStatusFromFile(contentRootPath, log) - : GetPredefinedOrderStatus()); - } + await context.SaveChangesAsync(); + } - await context.SaveChangesAsync(); - } + if (!context.OrderStatus.Any()) + { + context.OrderStatus.AddRange(useCustomizationData + ? GetOrderStatusFromFile(contentRootPath, logger) + : GetPredefinedOrderStatus()); + } + + await context.SaveChangesAsync(); + } + }); } - static IEnumerable GetCardTypesFromFile(string contentRootPath, ILogger log) + private IEnumerable GetCardTypesFromFile(string contentRootPath, ILogger log) { string csvFileCardTypes = Path.Combine(contentRootPath, "Setup", "CardTypes.csv"); @@ -86,7 +87,7 @@ .Where(x => x != null); } - static CardType CreateCardType(string value, ref int id) + private CardType CreateCardType(string value, ref int id) { if (String.IsNullOrEmpty(value)) { @@ -96,8 +97,7 @@ return new CardType(id++, value.Trim('"').Trim()); } - - private static IEnumerable GetPredefinedCardTypes() + private IEnumerable GetPredefinedCardTypes() { return new List() { @@ -107,7 +107,7 @@ }; } - static IEnumerable GetOrderStatusFromFile(string contentRootPath, ILogger log) + private IEnumerable GetOrderStatusFromFile(string contentRootPath, ILogger log) { string csvFileOrderStatus = Path.Combine(contentRootPath, "Setup", "OrderStatus.csv"); @@ -136,7 +136,7 @@ .Where(x => x != null); } - static OrderStatus CreateOrderStatus(string value, ref int id) + private OrderStatus CreateOrderStatus(string value, ref int id) { if (String.IsNullOrEmpty(value)) { @@ -146,7 +146,7 @@ return new OrderStatus(id++, value.Trim('"').Trim().ToLowerInvariant()); } - static IEnumerable GetPredefinedOrderStatus() + private IEnumerable GetPredefinedOrderStatus() { return new List() { @@ -159,7 +159,7 @@ }; } - static string[] GetHeaders(string[] requiredHeaders, string csvfile) + private string[] GetHeaders(string[] requiredHeaders, string csvfile) { string[] csvheaders = File.ReadLines(csvfile).First().ToLowerInvariant().Split(','); @@ -178,5 +178,19 @@ return csvheaders; } + + + private Policy CreatePolicy( ILogger logger, string prefix, int retries =3) + { + return Policy.Handle(). + WaitAndRetryAsync( + retryCount: retries, + sleepDurationProvider: retry => TimeSpan.FromSeconds(5), + onRetry: (exception, timeSpan, retry, ctx) => + { + logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); + } + ); + } } } diff --git a/src/Services/Ordering/Ordering.API/Ordering.API.csproj b/src/Services/Ordering/Ordering.API/Ordering.API.csproj index 80ea309d8..123f9e838 100644 --- a/src/Services/Ordering/Ordering.API/Ordering.API.csproj +++ b/src/Services/Ordering/Ordering.API/Ordering.API.csproj @@ -27,6 +27,7 @@ + diff --git a/src/Services/Ordering/Ordering.API/Program.cs b/src/Services/Ordering/Ordering.API/Program.cs index 382ba2594..46221b42c 100644 --- a/src/Services/Ordering/Ordering.API/Program.cs +++ b/src/Services/Ordering/Ordering.API/Program.cs @@ -1,6 +1,11 @@ using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; +using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF; +using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure; +using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using System.IO; namespace Microsoft.eShopOnContainers.Services.Ordering.API @@ -9,7 +14,19 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API { public static void Main(string[] args) { - BuildWebHost(args).Run(); + BuildWebHost(args) + .MigrateDbContext((context, services) => + { + var env = services.GetService(); + var settings = services.GetService>(); + var logger = services.GetService>(); + + new OrderingContextSeed() + .SeedAsync(context, env, settings, logger) + .Wait(); + }) + .MigrateDbContext((_,__)=>{}) + .Run(); } public static IWebHost BuildWebHost(string[] args) => diff --git a/src/Services/Ordering/Ordering.API/Startup.cs b/src/Services/Ordering/Ordering.API/Startup.cs index 1bf2fd22c..3ddd178c5 100644 --- a/src/Services/Ordering/Ordering.API/Startup.cs +++ b/src/Services/Ordering/Ordering.API/Startup.cs @@ -7,7 +7,6 @@ using global::Ordering.API.Application.IntegrationEvents.Events; using global::Ordering.API.Infrastructure.Filters; using global::Ordering.API.Infrastructure.HostedServices; - using Infrastructure; using Infrastructure.AutofacModules; using Infrastructure.Filters; using Infrastructure.Services; @@ -28,16 +27,13 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Ordering.Infrastructure; - using Polly; using RabbitMQ.Client; using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.Data.Common; - using System.Data.SqlClient; using System.IdentityModel.Tokens.Jwt; using System.Reflection; - using System.Threading.Tasks; public class Startup { @@ -85,6 +81,15 @@ ServiceLifetime.Scoped //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request) ); + services.AddDbContext(options => + { + options.UseSqlServer(Configuration["ConnectionString"], opts => + { + opts.MigrationsAssembly("Ordering.API"); + }); + }); + + services.Configure(Configuration); services.AddSwaggerGen(options => @@ -208,14 +213,6 @@ c.ConfigureOAuth2("orderingswaggerui", "", "", "Ordering Swagger UI"); }); - WaitForSqlAvailabilityAsync(loggerFactory, app, env).Wait(); - - var integrationEventLogContext = new IntegrationEventLogContext( - new DbContextOptionsBuilder() - .UseSqlServer(Configuration["ConnectionString"], b => b.MigrationsAssembly("Ordering.API")) - .Options); - integrationEventLogContext.Database.Migrate(); - ConfigureEventBus(app); } @@ -279,29 +276,5 @@ services.AddSingleton(); } - - private async Task WaitForSqlAvailabilityAsync(ILoggerFactory loggerFactory, IApplicationBuilder app, IHostingEnvironment env, int retries = 0) - { - var logger = loggerFactory.CreateLogger(nameof(Startup)); - var policy = CreatePolicy(retries, logger, nameof(WaitForSqlAvailabilityAsync)); - await policy.ExecuteAsync(async () => - { - await OrderingContextSeed.SeedAsync(app, env, loggerFactory); - }); - - } - - private Policy CreatePolicy(int retries, ILogger logger, string prefix) - { - return Policy.Handle(). - WaitAndRetryAsync( - retryCount: retries, - sleepDurationProvider: retry => TimeSpan.FromSeconds(5), - onRetry: (exception, timeSpan, retry, ctx) => - { - logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); - } - ); - } } } From 6b2a4ed4d462ccc04ac7f6caa7cf67e364dc8ebf Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Wed, 13 Sep 2017 15:59:58 +0200 Subject: [PATCH 02/41] Treat *.pfx as binary so CRLF will not change it --- .gitattributes | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitattributes b/.gitattributes index ef8281262..f2943e52e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -62,3 +62,10 @@ #*.PDF diff=astextplain #*.rtf diff=astextplain #*.RTF diff=astextplain + + +############################################################################### +# Certificates are binary +############################################################################### +*.pfx binary + From e0c0a796234a86b2ed4e97e88fb3bdb20f22cd96 Mon Sep 17 00:00:00 2001 From: Dennis van der Stelt Date: Wed, 13 Sep 2017 16:25:02 +0200 Subject: [PATCH 03/41] Rename Basket.cs to CustomerBasket.cs --- .../Basket/Basket.API/Model/{Basket.cs => CustomerBasket.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Services/Basket/Basket.API/Model/{Basket.cs => CustomerBasket.cs} (100%) diff --git a/src/Services/Basket/Basket.API/Model/Basket.cs b/src/Services/Basket/Basket.API/Model/CustomerBasket.cs similarity index 100% rename from src/Services/Basket/Basket.API/Model/Basket.cs rename to src/Services/Basket/Basket.API/Model/CustomerBasket.cs From 54d52e20d80105be0ff3c31bc3271bad617dd8ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 14 Sep 2017 12:01:04 +0200 Subject: [PATCH 04/41] Fix the "missing sub claim" --- src/Services/Identity/Identity.API/Startup.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Services/Identity/Identity.API/Startup.cs b/src/Services/Identity/Identity.API/Startup.cs index 572e0399f..28fa4da6c 100644 --- a/src/Services/Identity/Identity.API/Startup.cs +++ b/src/Services/Identity/Identity.API/Startup.cs @@ -46,7 +46,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity services.AddIdentity() .AddEntityFrameworkStores() - .AddDefaultTokenProviders(); + .AddDefaultTokenProviders() + .AddIdentityServer(); services.Configure(Configuration); From 04c90f09f9252706c65bb71e319197b03c1e2d66 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Thu, 14 Sep 2017 13:43:41 +0200 Subject: [PATCH 05/41] Fix view models namespaces issues. Remove unnecessary design time ordering context provider --- .../Views/Account/LoggedOut.cshtml | 2 +- .../Identity.API/Views/Account/Login.cshtml | 2 +- .../Identity.API/Views/Account/Logout.cshtml | 2 +- .../Views/Account/Register.cshtml | 3 +- .../Identity.API/Views/Consent/Index.cshtml | 2 +- .../Views/Consent/_ScopeListItem.cshtml | 2 +- .../Identity.API/Views/Shared/Error.cshtml | 2 +- .../OrderingDbContextDesigner.cs | 29 ------------------- .../OrderingContext.cs | 10 ++----- 9 files changed, 9 insertions(+), 45 deletions(-) delete mode 100644 src/Services/Ordering/Ordering.API/Infrastructure/OrderingDbContextDesigner.cs diff --git a/src/Services/Identity/Identity.API/Views/Account/LoggedOut.cshtml b/src/Services/Identity/Identity.API/Views/Account/LoggedOut.cshtml index ea6fdbfbc..f843973f8 100644 --- a/src/Services/Identity/Identity.API/Views/Account/LoggedOut.cshtml +++ b/src/Services/Identity/Identity.API/Views/Account/LoggedOut.cshtml @@ -1,4 +1,4 @@ -@model Identity.API.Models.AccountViewModels.LoggedOutViewModel +@model Microsoft.eShopOnContainers.Services.Identity.API.Models.AccountViewModels.LoggedOutViewModel