diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj b/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj index 40bd7bb2a..e71028818 100644 --- a/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj +++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj @@ -57,6 +57,8 @@ + + @@ -415,6 +417,7 @@ + Site.Master ASPXCodeBehind diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs b/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs index 471edbd18..53f9c9840 100644 --- a/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs +++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs @@ -1,5 +1,6 @@ using Autofac; using eShopOnContainers.Core.Services.Catalog; +using eShopOnContainers.Core.Services.RequestProvider; using System; using System.Collections.Generic; using System.Linq; @@ -34,8 +35,11 @@ namespace eShopOnContainers.Catalog.WebForms.Modules } else { - builder.RegisterType() + builder.RegisterType() .As(); + + builder.RegisterType() + .As(); } var container = builder.Build(); return container; diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs index f77eb11d4..0a6339b3a 100644 --- a/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs +++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs @@ -24,7 +24,7 @@ namespace eShopOnContainers.Core.Services.Catalog try { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = string.Format("api/v1/catalog/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId); @@ -49,7 +49,7 @@ namespace eShopOnContainers.Core.Services.Catalog try { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = "api/v1/catalog/items"; @@ -83,7 +83,7 @@ namespace eShopOnContainers.Core.Services.Catalog try { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = "api/v1/catalog/catalogbrands"; @@ -108,7 +108,7 @@ namespace eShopOnContainers.Core.Services.Catalog try { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = "api/v1/catalog/catalogtypes"; @@ -131,7 +131,7 @@ namespace eShopOnContainers.Core.Services.Catalog public Task DeleteCatalogItemAsync(string catalogItemId) { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = $"api/v1/catalog/{catalogItemId}"; @@ -143,7 +143,7 @@ namespace eShopOnContainers.Core.Services.Catalog public Task UpdateCatalogItemAsync(CatalogItem item) { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = "api/v1/catalog/edit"; @@ -155,7 +155,7 @@ namespace eShopOnContainers.Core.Services.Catalog public Task CreateCatalogItemAsync(CatalogItem item) { // TODO: - UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */); + UriBuilder builder = new UriBuilder("http://catalog.api:5101"); builder.Path = "api/v1/catalog/create"; diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Services/RequestProvider.cs b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/RequestProvider.cs new file mode 100644 index 000000000..a35417eaa --- /dev/null +++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/RequestProvider.cs @@ -0,0 +1,174 @@ +using eShopOnContainers.Core.Exceptions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using System; + +// Taken from https://raw.githubusercontent.com/dotnet/eShopOnContainers/dev/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs +// TODO: DRY This + +namespace eShopOnContainers.Core.Services.RequestProvider +{ + public class RequestProvider : IRequestProvider + { + private readonly JsonSerializerSettings _serializerSettings; + + public RequestProvider() + { + _serializerSettings = new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + DateTimeZoneHandling = DateTimeZoneHandling.Utc, + NullValueHandling = NullValueHandling.Ignore + }; + + _serializerSettings.Converters.Add(new StringEnumConverter()); + } + + public async Task GetAsync(string uri, string token = "") + { + HttpClient httpClient = CreateHttpClient(token); + HttpResponseMessage response = await httpClient.GetAsync(uri); + + await HandleResponse(response); + + string serialized = await response.Content.ReadAsStringAsync(); + + TResult result = await Task.Run(() => + JsonConvert.DeserializeObject(serialized, _serializerSettings)); + + return result; + } + + public async Task PostAsync(string uri, TResult data, string token = "", string header = "") + { + HttpClient httpClient = CreateHttpClient(token); + + if (!string.IsNullOrEmpty(header)) + { + AddHeaderParameter(httpClient, header); + } + + var content = new StringContent(JsonConvert.SerializeObject(data)); + content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + HttpResponseMessage response = await httpClient.PostAsync(uri, content); + + await HandleResponse(response); + + string serialized = await response.Content.ReadAsStringAsync(); + + TResult result = await Task.Run(() => + JsonConvert.DeserializeObject(serialized, _serializerSettings)); + + return result; + } + + public Task PostAsync(string uri, TResult data, string token = "") + { + return PostAsync(uri, data, token); + } + + public async Task PostAsync(string uri, TRequest data, string token = "") + { + HttpClient httpClient = CreateHttpClient(token); + string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); + var content = new StringContent(serialized, Encoding.UTF8, "application/json"); + HttpResponseMessage response = await httpClient.PostAsync(uri, content); + + await HandleResponse(response); + + string responseData = await response.Content.ReadAsStringAsync(); + + return await Task.Run(() => JsonConvert.DeserializeObject(responseData, _serializerSettings)); + } + + public Task PutAsync(string uri, TResult data, string token = "") + { + return PutAsync(uri, data, token); + } + + public async Task PutAsync(string uri, TRequest data, string token = "") + { + HttpClient httpClient = CreateHttpClient(token); + string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); + HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json")); + + await HandleResponse(response); + + string responseData = await response.Content.ReadAsStringAsync(); + + return await Task.Run(() => JsonConvert.DeserializeObject(responseData, _serializerSettings)); + } + + public async Task DeleteAsync(string uri, string token = "") + { + HttpClient httpClient = CreateHttpClient(token); + + await httpClient.DeleteAsync(uri); + } + + private HttpClient CreateHttpClient(string token = "") + { + var httpClient = new HttpClient(); + + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + if (!string.IsNullOrEmpty(token)) + { + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + + return httpClient; + } + + private void AddHeaderParameter(HttpClient httpClient, string parameter) + { + if (httpClient == null) + return; + + if (string.IsNullOrEmpty(parameter)) + return; + + httpClient.DefaultRequestHeaders.Add(parameter, Guid.NewGuid().ToString()); + } + + private async Task HandleResponse(HttpResponseMessage response) + { + if (!response.IsSuccessStatusCode) + { + var content = await response.Content.ReadAsStringAsync(); + + if (response.StatusCode == HttpStatusCode.Forbidden + || response.StatusCode == HttpStatusCode.Unauthorized) + { + throw new ServiceAuthenticationException(content); + } + + throw new HttpRequestException(content); + } + } + } +} + +// Taken from: https://raw.githubusercontent.com/dotnet/eShopOnContainers/dev/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Exceptions/ServiceAuthenticationException.cs +namespace eShopOnContainers.Core.Exceptions +{ + public class ServiceAuthenticationException : Exception + { + public string Content { get; } + + public ServiceAuthenticationException() + { + } + + public ServiceAuthenticationException(string content) + { + Content = content; + } + } +} diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Web.Debug.config b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.Debug.config new file mode 100644 index 000000000..15c33a329 --- /dev/null +++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.Debug.config @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config index 46d4ab24e..30a2748b0 100644 --- a/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config +++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config @@ -9,7 +9,7 @@
- + diff --git a/src/Web/Catalog.WebForms/docker-compose.override.yml b/src/Web/Catalog.WebForms/docker-compose.override.yml index dc74370aa..76aa2481d 100644 --- a/src/Web/Catalog.WebForms/docker-compose.override.yml +++ b/src/Web/Catalog.WebForms/docker-compose.override.yml @@ -20,8 +20,3 @@ services: catalog.webforms: ports: - "80:80" - -networks: - default: - external: - name: nat diff --git a/src/Web/Catalog.WebForms/docker-compose.yml b/src/Web/Catalog.WebForms/docker-compose.yml index 99cbd7914..7c13247b1 100644 --- a/src/Web/Catalog.WebForms/docker-compose.yml +++ b/src/Web/Catalog.WebForms/docker-compose.yml @@ -19,3 +19,8 @@ services: sql.data: image: microsoft/mssql-server-windows + +networks: + default: + external: + name: nat