diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index d3b8a8db8..583b4499c 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -146,6 +146,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{32EE4736 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{120CABB3-0FEA-4B40-B4B5-2D3041798C80}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Payment", "Payment", "{C61C5CFE-4876-4A46-A96E-5BBF596A984A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Payment.API", "src\Services\Payment\Payment.API\Payment.API.csproj", "{0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1792,6 +1796,54 @@ Global {639BB197-D112-47A7-A44A-471DDB0FA1AE}.Release|x64.Build.0 = Release|Any CPU {639BB197-D112-47A7-A44A-471DDB0FA1AE}.Release|x86.ActiveCfg = Release|Any CPU {639BB197-D112-47A7-A44A-471DDB0FA1AE}.Release|x86.Build.0 = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|ARM.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|iPhone.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|x64.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|x64.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|x86.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.AppStore|x86.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|ARM.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|iPhone.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|x64.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|x64.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|x86.ActiveCfg = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Debug|x86.Build.0 = Debug|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|Any CPU.Build.0 = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|ARM.ActiveCfg = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|ARM.Build.0 = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|iPhone.ActiveCfg = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|iPhone.Build.0 = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|x64.ActiveCfg = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|x64.Build.0 = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|x86.ActiveCfg = Release|Any CPU + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1856,6 +1908,8 @@ Global {C3F6ED48-E26D-4D57-970F-B82E69467BA1} = {41139F64-4046-4F16-96B7-D941D96FA9C6} {32EE4736-7534-47EC-BAAD-C00AF3130F80} = {A5260DE0-1FDD-467E-9CC1-A028AB081CEE} {120CABB3-0FEA-4B40-B4B5-2D3041798C80} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} + {C61C5CFE-4876-4A46-A96E-5BBF596A984A} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} + {0AB40131-8AD7-436F-9C6B-EDA59CFA3A84} = {C61C5CFE-4876-4A46-A96E-5BBF596A984A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/k8s/helm/app.yaml b/k8s/helm/app.yaml index 6ca5d9d31..bd3988c5e 100644 --- a/k8s/helm/app.yaml +++ b/k8s/helm/app.yaml @@ -1,4 +1,4 @@ -# This heml values file defines app-based settings +# This helm values file defines app-based settings # Charts use those values, so this file **MUST** be included in all chart releases diff --git a/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs b/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs index 446fcd7b7..2cd86669b 100644 --- a/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs +++ b/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs @@ -22,7 +22,7 @@ private readonly string AUTOFAC_SCOPE_NAME = "eshop_event_bus"; private const string INTEGRATION_EVENT_SUFIX = "IntegrationEvent"; - public EventBusServiceBus(IServiceBusPersisterConnection serviceBusPersisterConnection, + public EventBusServiceBus(IServiceBusPersisterConnection serviceBusPersisterConnection, ILogger logger, IEventBusSubscriptionsManager subsManager, string subscriptionClientName, ILifetimeScope autofac) { @@ -30,7 +30,7 @@ _logger = logger; _subsManager = subsManager ?? new InMemoryEventBusSubscriptionsManager(); - _subscriptionClient = new SubscriptionClient(serviceBusPersisterConnection.ServiceBusConnectionStringBuilder, + _subscriptionClient = new SubscriptionClient(serviceBusPersisterConnection.ServiceBusConnectionStringBuilder, subscriptionClientName); _autofac = autofac; @@ -68,7 +68,7 @@ where T : IntegrationEvent where TH : IIntegrationEventHandler { - var eventName = typeof(T).Name.Replace(INTEGRATION_EVENT_SUFIX, ""); + var eventName = typeof(T).Name.Replace(INTEGRATION_EVENT_SUFIX, ""); var containsKey = _subsManager.HasSubscriptionsForEvent(); if (!containsKey) @@ -81,7 +81,7 @@ Name = eventName }).GetAwaiter().GetResult(); } - catch(ServiceBusException) + catch (ServiceBusException) { _logger.LogInformation($"The messaging entity {eventName} already exists."); } @@ -129,10 +129,12 @@ { var eventName = $"{message.Label}{INTEGRATION_EVENT_SUFIX}"; var messageData = Encoding.UTF8.GetString(message.Body); - await ProcessEvent(eventName, messageData); - + // Complete the message so that it is not received again. - await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken); + if (await ProcessEvent(eventName, messageData)) + { + await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken); + } }, new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 10, AutoComplete = false }); } @@ -148,8 +150,9 @@ return Task.CompletedTask; } - private async Task ProcessEvent(string eventName, string message) + private async Task ProcessEvent(string eventName, string message) { + var processed = false; if (_subsManager.HasSubscriptionsForEvent(eventName)) { using (var scope = _autofac.BeginLifetimeScope(AUTOFAC_SCOPE_NAME)) @@ -173,7 +176,9 @@ } } } + processed = true; } + return processed; } private void RemoveDefaultRule() @@ -191,4 +196,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Services/Basket/Basket.API/Basket.API.csproj b/src/Services/Basket/Basket.API/Basket.API.csproj index cea7bbedb..36fc95496 100644 --- a/src/Services/Basket/Basket.API/Basket.API.csproj +++ b/src/Services/Basket/Basket.API/Basket.API.csproj @@ -17,6 +17,7 @@ + diff --git a/src/Services/Basket/Basket.API/Program.cs b/src/Services/Basket/Basket.API/Program.cs index 19bbf2c24..303a4625d 100644 --- a/src/Services/Basket/Basket.API/Program.cs +++ b/src/Services/Basket/Basket.API/Program.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using System; using System.IO; namespace Microsoft.eShopOnContainers.Services.Basket.API @@ -26,7 +27,21 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API .UseStartup() .ConfigureAppConfiguration((builderContext, config) => { - config.AddEnvironmentVariables(); + var builtConfig = config.Build(); + + var configurationBuilder = new ConfigurationBuilder(); + + if (Convert.ToBoolean(builtConfig["UseVault"])) + { + configurationBuilder.AddAzureKeyVault( + $"https://{builtConfig["Vault:Name"]}.vault.azure.net/", + builtConfig["Vault:ClientId"], + builtConfig["Vault:ClientSecret"]); + } + + configurationBuilder.AddEnvironmentVariables(); + + config.AddConfiguration(configurationBuilder.Build()); }) .ConfigureLogging((hostingContext, builder) => { diff --git a/src/Services/Basket/Basket.API/appsettings.json b/src/Services/Basket/Basket.API/appsettings.json index 16d56d94d..4bff4d70d 100644 --- a/src/Services/Basket/Basket.API/appsettings.json +++ b/src/Services/Basket/Basket.API/appsettings.json @@ -14,5 +14,11 @@ "ApplicationInsights": { "InstrumentationKey": "" }, - "EventBusRetryCount": 5 + "EventBusRetryCount": 5, + "UseVault": false, + "Vault": { + "Name": "eshop", + "ClientId": "your-clien-id", + "ClientSecret": "your-client-secret" + } } \ No newline at end of file diff --git a/src/Services/Catalog/Catalog.API/Catalog.API.csproj b/src/Services/Catalog/Catalog.API/Catalog.API.csproj index c654c510e..90abe593a 100644 --- a/src/Services/Catalog/Catalog.API/Catalog.API.csproj +++ b/src/Services/Catalog/Catalog.API/Catalog.API.csproj @@ -39,6 +39,7 @@ + diff --git a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs index 20d1b1215..584f7a0af 100644 --- a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs +++ b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs @@ -64,23 +64,26 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers { var numIds = ids.Split(',') .Select(id => (Ok: int.TryParse(id, out int x), Value: x)); + if (!numIds.All(nid => nid.Ok)) { return BadRequest("ids value invalid. Must be comma-separated list of numbers"); } - var idsToSelect = numIds.Select(id => id.Value); + var idsToSelect = numIds + .Select(id => id.Value); + var items = _catalogContext.CatalogItems.Where(ci => idsToSelect.Contains(ci.Id)).ToList(); items = ChangeUriPlaceholder(items); - return Ok(items); + return Ok(items); } [HttpGet] [Route("items/{id:int}")] [ProducesResponseType((int)HttpStatusCode.NotFound)] - [ProducesResponseType(typeof(CatalogItem),(int)HttpStatusCode.OK)] + [ProducesResponseType(typeof(CatalogItem), (int)HttpStatusCode.OK)] public async Task GetItemById(int id) { if (id <= 0) @@ -127,19 +130,44 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers return Ok(model); } - // GET api/v1/[controller]/items/type/1/brand/null[?pageSize=3&pageIndex=10] + // GET api/v1/[controller]/items/type/1/brand[?pageSize=3&pageIndex=10] [HttpGet] - [Route("[action]/type/{catalogTypeId}/brand/{catalogBrandId}")] + [Route("[action]/type/{catalogTypeId}/brand/{catalogBrandId:int?}")] [ProducesResponseType(typeof(PaginatedItemsViewModel), (int)HttpStatusCode.OK)] - public async Task Items(int? catalogTypeId, int? catalogBrandId, [FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0) + public async Task Items(int catalogTypeId, int? catalogBrandId, [FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0) { var root = (IQueryable)_catalogContext.CatalogItems; - if (catalogTypeId.HasValue) + root = root.Where(ci => ci.CatalogTypeId == catalogTypeId); + + if (catalogBrandId.HasValue) { - root = root.Where(ci => ci.CatalogTypeId == catalogTypeId); + root = root.Where(ci => ci.CatalogBrandId == catalogBrandId); } + var totalItems = await root + .LongCountAsync(); + + var itemsOnPage = await root + .Skip(pageSize * pageIndex) + .Take(pageSize) + .ToListAsync(); + + itemsOnPage = ChangeUriPlaceholder(itemsOnPage); + + var model = new PaginatedItemsViewModel( + pageIndex, pageSize, totalItems, itemsOnPage); + + return Ok(model); + } + // GET api/v1/[controller]/items/type/all/brand[?pageSize=3&pageIndex=10] + [HttpGet] + [Route("[action]/type/all/brand/{catalogBrandId:int?}")] + [ProducesResponseType(typeof(PaginatedItemsViewModel), (int)HttpStatusCode.OK)] + public async Task Items(int? catalogBrandId, [FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0) + { + var root = (IQueryable)_catalogContext.CatalogItems; + if (catalogBrandId.HasValue) { root = root.Where(ci => ci.CatalogBrandId == catalogBrandId); diff --git a/src/Services/Catalog/Catalog.API/Program.cs b/src/Services/Catalog/Catalog.API/Program.cs index bef3fa360..8f3910c84 100644 --- a/src/Services/Catalog/Catalog.API/Program.cs +++ b/src/Services/Catalog/Catalog.API/Program.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using System; using System.IO; namespace Microsoft.eShopOnContainers.Services.Catalog.API { @@ -38,7 +39,21 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API .UseWebRoot("Pics") .ConfigureAppConfiguration((builderContext, config) => { - config.AddEnvironmentVariables(); + var builtConfig = config.Build(); + + var configurationBuilder = new ConfigurationBuilder(); + + if (Convert.ToBoolean(builtConfig["UseVault"])) + { + configurationBuilder.AddAzureKeyVault( + $"https://{builtConfig["Vault:Name"]}.vault.azure.net/", + builtConfig["Vault:ClientId"], + builtConfig["Vault:ClientSecret"]); + } + + configurationBuilder.AddEnvironmentVariables(); + + config.AddConfiguration(configurationBuilder.Build()); }) .ConfigureLogging((hostingContext, builder) => { diff --git a/src/Services/Catalog/Catalog.API/appsettings.json b/src/Services/Catalog/Catalog.API/appsettings.json index 0f36d229c..0bf489699 100644 --- a/src/Services/Catalog/Catalog.API/appsettings.json +++ b/src/Services/Catalog/Catalog.API/appsettings.json @@ -16,5 +16,11 @@ "ApplicationInsights": { "InstrumentationKey": "" }, - "EventBusRetryCount": 5 + "EventBusRetryCount": 5, + "UseVault": false, + "Vault": { + "Name": "eshop", + "ClientId": "your-clien-id", + "ClientSecret": "your-client-secret" + } } diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index cf4c39568..96a45e5ef 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -19,6 +19,7 @@ + diff --git a/src/Services/Identity/Identity.API/Program.cs b/src/Services/Identity/Identity.API/Program.cs index 7b73838e6..6b8353062 100644 --- a/src/Services/Identity/Identity.API/Program.cs +++ b/src/Services/Identity/Identity.API/Program.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using System; using System.IO; namespace Microsoft.eShopOnContainers.Services.Identity.API @@ -45,7 +46,21 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API .UseStartup() .ConfigureAppConfiguration((builderContext, config) => { - config.AddEnvironmentVariables(); + var builtConfig = config.Build(); + + var configurationBuilder = new ConfigurationBuilder(); + + if (Convert.ToBoolean(builtConfig["UseVault"])) + { + configurationBuilder.AddAzureKeyVault( + $"https://{builtConfig["Vault:Name"]}.vault.azure.net/", + builtConfig["Vault:ClientId"], + builtConfig["Vault:ClientSecret"]); + } + + configurationBuilder.AddEnvironmentVariables(); + + config.AddConfiguration(configurationBuilder.Build()); }) .ConfigureLogging((hostingContext, builder) => { diff --git a/src/Services/Identity/Identity.API/appsettings.json b/src/Services/Identity/Identity.API/appsettings.json index 6b251be41..c5a109218 100644 --- a/src/Services/Identity/Identity.API/appsettings.json +++ b/src/Services/Identity/Identity.API/appsettings.json @@ -15,5 +15,11 @@ }, "ApplicationInsights": { "InstrumentationKey": "" + }, + "UseVault": false, + "Vault": { + "Name": "eshop", + "ClientId": "your-clien-id", + "ClientSecret": "your-client-secret" } } diff --git a/src/Services/Location/Locations.API/Locations.API.csproj b/src/Services/Location/Locations.API/Locations.API.csproj index 20dfbda7e..9ca1205eb 100644 --- a/src/Services/Location/Locations.API/Locations.API.csproj +++ b/src/Services/Location/Locations.API/Locations.API.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Services/Location/Locations.API/Program.cs b/src/Services/Location/Locations.API/Program.cs index 85f3191cc..aedc1bed5 100644 --- a/src/Services/Location/Locations.API/Program.cs +++ b/src/Services/Location/Locations.API/Program.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using System; using System.IO; namespace Microsoft.eShopOnContainers.Services.Locations.API @@ -21,7 +22,21 @@ namespace Microsoft.eShopOnContainers.Services.Locations.API .UseStartup() .ConfigureAppConfiguration((builderContext, config) => { - config.AddEnvironmentVariables(); + var builtConfig = config.Build(); + + var configurationBuilder = new ConfigurationBuilder(); + + if (Convert.ToBoolean(builtConfig["UseVault"])) + { + configurationBuilder.AddAzureKeyVault( + $"https://{builtConfig["Vault:Name"]}.vault.azure.net/", + builtConfig["Vault:ClientId"], + builtConfig["Vault:ClientSecret"]); + } + + configurationBuilder.AddEnvironmentVariables(); + + config.AddConfiguration(configurationBuilder.Build()); }) .ConfigureLogging((hostingContext, builder) => { diff --git a/src/Services/Location/Locations.API/appsettings.json b/src/Services/Location/Locations.API/appsettings.json index a00ef1188..cd4166bb0 100644 --- a/src/Services/Location/Locations.API/appsettings.json +++ b/src/Services/Location/Locations.API/appsettings.json @@ -15,5 +15,11 @@ "ApplicationInsights": { "InstrumentationKey": "" }, - "EventBusRetryCount": 5 + "EventBusRetryCount": 5, + "UseVault": false, + "Vault": { + "Name": "eshop", + "ClientId": "your-clien-id", + "ClientSecret": "your-client-secret" + } } \ No newline at end of file diff --git a/src/Services/Marketing/Marketing.API/Marketing.API.csproj b/src/Services/Marketing/Marketing.API/Marketing.API.csproj index 7db4320c5..c65da0eee 100644 --- a/src/Services/Marketing/Marketing.API/Marketing.API.csproj +++ b/src/Services/Marketing/Marketing.API/Marketing.API.csproj @@ -24,6 +24,7 @@ + diff --git a/src/Services/Marketing/Marketing.API/Program.cs b/src/Services/Marketing/Marketing.API/Program.cs index 70b2362e1..06c5b72ca 100644 --- a/src/Services/Marketing/Marketing.API/Program.cs +++ b/src/Services/Marketing/Marketing.API/Program.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; + using System; using System.IO; public class Program @@ -33,7 +34,21 @@ .UseWebRoot("Pics") .ConfigureAppConfiguration((builderContext, config) => { - config.AddEnvironmentVariables(); + var builtConfig = config.Build(); + + var configurationBuilder = new ConfigurationBuilder(); + + if (Convert.ToBoolean(builtConfig["UseVault"])) + { + configurationBuilder.AddAzureKeyVault( + $"https://{builtConfig["Vault:Name"]}.vault.azure.net/", + builtConfig["Vault:ClientId"], + builtConfig["Vault:ClientSecret"]); + } + + configurationBuilder.AddEnvironmentVariables(); + + config.AddConfiguration(configurationBuilder.Build()); }) .ConfigureLogging((hostingContext, builder) => { diff --git a/src/Services/Marketing/Marketing.API/appsettings.json b/src/Services/Marketing/Marketing.API/appsettings.json index acea415ce..2af660446 100644 --- a/src/Services/Marketing/Marketing.API/appsettings.json +++ b/src/Services/Marketing/Marketing.API/appsettings.json @@ -16,5 +16,11 @@ "ApplicationInsights": { "InstrumentationKey": "" }, - "EventBusRetryCount": 5 + "EventBusRetryCount": 5, + "UseVault": false, + "Vault": { + "Name": "eshop", + "ClientId": "your-clien-id", + "ClientSecret": "your-client-secret" + } } \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.API/Ordering.API.csproj b/src/Services/Ordering/Ordering.API/Ordering.API.csproj index 8576e3cc8..11b2d13f9 100644 --- a/src/Services/Ordering/Ordering.API/Ordering.API.csproj +++ b/src/Services/Ordering/Ordering.API/Ordering.API.csproj @@ -37,6 +37,7 @@ + diff --git a/src/Services/Ordering/Ordering.API/Program.cs b/src/Services/Ordering/Ordering.API/Program.cs index 011f3004f..92ef6ba86 100644 --- a/src/Services/Ordering/Ordering.API/Program.cs +++ b/src/Services/Ordering/Ordering.API/Program.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using System; using System.IO; namespace Microsoft.eShopOnContainers.Services.Ordering.API @@ -37,8 +38,21 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((builderContext, config) => { - config.AddJsonFile("settings.json"); - config.AddEnvironmentVariables(); + var builtConfig = config.Build(); + + var configurationBuilder = new ConfigurationBuilder(); + + if (Convert.ToBoolean(builtConfig["UseVault"])) + { + configurationBuilder.AddAzureKeyVault( + $"https://{builtConfig["Vault:Name"]}.vault.azure.net/", + builtConfig["Vault:ClientId"], + builtConfig["Vault:ClientSecret"]); + } + + configurationBuilder.AddEnvironmentVariables(); + + config.AddConfiguration(configurationBuilder.Build()); }) .ConfigureLogging((hostingContext, builder) => { diff --git a/src/Services/Ordering/Ordering.API/settings.json b/src/Services/Ordering/Ordering.API/appsettings.json similarity index 77% rename from src/Services/Ordering/Ordering.API/settings.json rename to src/Services/Ordering/Ordering.API/appsettings.json index ef9b9e03c..96dd74630 100644 --- a/src/Services/Ordering/Ordering.API/settings.json +++ b/src/Services/Ordering/Ordering.API/appsettings.json @@ -17,5 +17,11 @@ "InstrumentationKey": "" }, "EventBusRetryCount": 5, - "EventBusConnection": "localhost" + "EventBusConnection": "localhost", + "UseVault": false, + "Vault": { + "Name": "eshop", + "ClientId": "your-clien-id", + "ClientSecret": "your-client-secret" + } } diff --git a/src/Web/WebMVC/Infrastructure/API.cs b/src/Web/WebMVC/Infrastructure/API.cs index d6f485e21..b601282e0 100644 --- a/src/Web/WebMVC/Infrastructure/API.cs +++ b/src/Web/WebMVC/Infrastructure/API.cs @@ -1,6 +1,4 @@ -using System; - -namespace WebMVC.Infrastructure +namespace WebMVC.Infrastructure { public static class API { @@ -55,11 +53,20 @@ namespace WebMVC.Infrastructure { var filterQs = ""; - if (brand.HasValue || type.HasValue) + if (type.HasValue) + { + var brandQs = (brand.HasValue) ? brand.Value.ToString() : string.Empty; + filterQs = $"/type/{type.Value}/brand/{brandQs}"; + + } + else if (brand.HasValue) + { + var brandQs = (brand.HasValue) ? brand.Value.ToString() : string.Empty; + filterQs = $"/type/all/brand/{brandQs}"; + } + else { - var brandQs = (brand.HasValue) ? brand.Value.ToString() : "null"; - var typeQs = (type.HasValue) ? type.Value.ToString() : "null"; - filterQs = $"/type/{typeQs}/brand/{brandQs}"; + filterQs = string.Empty; } return $"{baseUri}items{filterQs}?pageIndex={page}&pageSize={take}"; diff --git a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts index fc5bc4c5e..3983c3cad 100644 --- a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts +++ b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts @@ -29,10 +29,14 @@ export class CatalogService { getCatalog(pageIndex: number, pageSize: number, brand: number, type: number): Observable { let url = this.catalogUrl; - if (brand || type) { - url = this.catalogUrl + '/type/' + ((type) ? type.toString() : 'null') + '/brand/' + ((brand) ? brand.toString() : 'null'); - } + if (type) { + url = this.catalogUrl + '/type/' + type.toString() + '/brand/' + ((brand) ? brand.toString() : ''); + } + else if (brand) { + url = this.catalogUrl + '/type/all' + '/brand/' + ((brand) ? brand.toString() : ''); + } + url = url + '?pageIndex=' + pageIndex + '&pageSize=' + pageSize; return this.service.get(url).map((response: Response) => { diff --git a/test/ServicesTests/Application.FunctionalTests/Services/Location/LocationsScenariosBase.cs b/test/ServicesTests/Application.FunctionalTests/Services/Location/LocationsScenariosBase.cs index 334f3f024..4c3bd1b29 100644 --- a/test/ServicesTests/Application.FunctionalTests/Services/Location/LocationsScenariosBase.cs +++ b/test/ServicesTests/Application.FunctionalTests/Services/Location/LocationsScenariosBase.cs @@ -19,7 +19,7 @@ .UseContentRoot(Path.GetDirectoryName(path)) .ConfigureAppConfiguration(cb => { - cb.AddJsonFile("Services/Locations/appsettings.json", optional: false) + cb.AddJsonFile("Services/Location/appsettings.json", optional: false) .AddEnvironmentVariables(); }).UseStartup();