From 16ce5782d715e5b350be3a59bee0425c30077236 Mon Sep 17 00:00:00 2001 From: vc-ci Date: Mon, 31 Oct 2022 08:36:52 +0000 Subject: [PATCH 1/4] 6.7.0 --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 311963d1..c74baf02 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,7 +7,7 @@ VirtoCommerce - 6.6.0 + 6.7.0 $(VersionSuffix)-$(BuildNumber) From a17e77a498728b6ce54e873f7a4c67e63f5bce75 Mon Sep 17 00:00:00 2001 From: Artem Makarov Date: Tue, 8 Nov 2022 17:27:41 +0300 Subject: [PATCH 2/4] feat: add an email confirmation endpoint (#630) --- .../Security/ConfirmEmailModel.cs | 13 ++++++++ .../Controllers/Api/ApiAccountController.cs | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 VirtoCommerce.Storefront.Model/Security/ConfirmEmailModel.cs diff --git a/VirtoCommerce.Storefront.Model/Security/ConfirmEmailModel.cs b/VirtoCommerce.Storefront.Model/Security/ConfirmEmailModel.cs new file mode 100644 index 00000000..d35e6b58 --- /dev/null +++ b/VirtoCommerce.Storefront.Model/Security/ConfirmEmailModel.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace VirtoCommerce.Storefront.Model.Security +{ + public class ConfirmEmailModel + { + [Required(ErrorMessage = "A UserId is required")] + public string UserId { get; set; } + + [Required(ErrorMessage = "A Token is required")] + public string Token { get; set; } + } +} diff --git a/VirtoCommerce.Storefront/Controllers/Api/ApiAccountController.cs b/VirtoCommerce.Storefront/Controllers/Api/ApiAccountController.cs index 6697b968..7616cc6c 100644 --- a/VirtoCommerce.Storefront/Controllers/Api/ApiAccountController.cs +++ b/VirtoCommerce.Storefront/Controllers/Api/ApiAccountController.cs @@ -439,6 +439,37 @@ public async Task> ResetPassword([FromBod return result; } + // POST: storefrontapi/account/confirmemail + [HttpPost("confirmemail")] + [AllowAnonymous] + public async Task> ConfirmEmail([FromBody] ConfirmEmailModel model) + { + TryValidateModel(model); + + if (!ModelState.IsValid) + { + return UserActionIdentityResult.Failed(ModelState.Values.SelectMany(x => x.Errors) + .Select(x => new IdentityError { Description = x.ErrorMessage }) + .ToArray()); + } + + var user = await _signInManager.UserManager.FindByIdAsync(model.UserId); + + if (user == null) + { + // Don't reveal that the user does not exist + return UserActionIdentityResult.Failed(SecurityErrorDescriber.InvalidToken()); + } + + var confirmEmailResult = await _signInManager.UserManager.ConfirmEmailAsync(user, model.Token); + + if (!confirmEmailResult.Succeeded) + { + return UserActionIdentityResult.Failed(confirmEmailResult.Errors.ToArray()); + } + + return UserActionIdentityResult.Success; + } private static string GetUserEmail(User user) { From 6e240bff2738c8ff340d3dde49201e0c99e7eb79 Mon Sep 17 00:00:00 2001 From: Basil Kotov Date: Wed, 9 Nov 2022 12:16:33 +0200 Subject: [PATCH 3/4] change approach to reset cache (#629) feat: change approach to reset cache - added Controller for WebHook. feat: Updated Application Insights. fix: Update solution to Visual Studio Version 17 and other project infromation. --- Directory.Build.props | 2 +- VirtoCommerce.Storefront.sln | 4 +-- .../Api/ApiStaticContentController.cs | 34 ++++++++++++++++--- .../Autorest/BaseAuthHandler.cs | 2 +- .../Models/ResetCacheModel.cs | 29 ++++++++++++++++ .../VirtoCommerce.Storefront.csproj | 10 +++--- 6 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 VirtoCommerce.Storefront/Models/ResetCacheModel.cs diff --git a/Directory.Build.props b/Directory.Build.props index c74baf02..92da8282 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,7 +3,7 @@ VirtoCommerce - Copyright © VirtoCommerce 2011-2020 + Copyright © VirtoCommerce 2011-2022 VirtoCommerce diff --git a/VirtoCommerce.Storefront.sln b/VirtoCommerce.Storefront.sln index e6d36280..1df95027 100644 --- a/VirtoCommerce.Storefront.sln +++ b/VirtoCommerce.Storefront.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29613.14 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtoCommerce.Storefront", "VirtoCommerce.Storefront\VirtoCommerce.Storefront.csproj", "{84C14E0A-0F36-4BB5-9C00-7E8FB72891C2}" EndProject diff --git a/VirtoCommerce.Storefront/Controllers/Api/ApiStaticContentController.cs b/VirtoCommerce.Storefront/Controllers/Api/ApiStaticContentController.cs index 50539150..6d10d3f6 100644 --- a/VirtoCommerce.Storefront/Controllers/Api/ApiStaticContentController.cs +++ b/VirtoCommerce.Storefront/Controllers/Api/ApiStaticContentController.cs @@ -8,6 +8,7 @@ using VirtoCommerce.Storefront.Model; using VirtoCommerce.Storefront.Model.Common; using VirtoCommerce.Storefront.Model.StaticContent; +using VirtoCommerce.Storefront.Models; namespace VirtoCommerce.Storefront.Controllers.Api { @@ -20,19 +21,44 @@ public ApiStaticContentController(IWorkContextAccessor workContextAccessor, ISto { } + // POST: storefrontapi/content/reset-cache + [HttpPost("reset-cache")] + public ActionResult ResetCache([FromBody] ResetCacheEventModel webHookEvent) + { + if (TryResetCacheInternal(webHookEvent?.EventBody?.FirstOrDefault()?.Type)) + { + return Ok("OK"); + } + // we can't return 400, because webhook module use it to repeat request + return Ok("Failed"); + } + + // POST: storefrontapi/content/reset-cache/theme [HttpPost("reset-cache/{region}")] public ActionResult ResetCache([FromRoute] string region) + { + if (TryResetCacheInternal(region)) + { + return Ok("OK"); + } + // we can't return 400, because webhook module use it to repeat request + return Ok("Failed"); + } + + private static bool TryResetCacheInternal(string region) { switch (region) { - case "theme": ThemeEngineCacheRegion.ExpireRegion(); - break; + case "theme": + case "themes": + ThemeEngineCacheRegion.ExpireRegion(); + return true; case "pages": case "blogs": StaticContentCacheRegion.ExpireRegion(); - break; + return true; } - return Ok(); + return false; } // POST: storefrontapi/content/pages diff --git a/VirtoCommerce.Storefront/Infrastructure/Autorest/BaseAuthHandler.cs b/VirtoCommerce.Storefront/Infrastructure/Autorest/BaseAuthHandler.cs index 517bdf5d..dc04f9f8 100644 --- a/VirtoCommerce.Storefront/Infrastructure/Autorest/BaseAuthHandler.cs +++ b/VirtoCommerce.Storefront/Infrastructure/Autorest/BaseAuthHandler.cs @@ -75,7 +75,7 @@ protected void AddCurrentUser(HttpRequestMessage request) /// protected void AddUserIp(HttpRequestMessage request) { - var userIp = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); + var userIp = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress.ToString(); if (!string.IsNullOrEmpty(userIp)) { diff --git a/VirtoCommerce.Storefront/Models/ResetCacheModel.cs b/VirtoCommerce.Storefront/Models/ResetCacheModel.cs new file mode 100644 index 00000000..6768cb06 --- /dev/null +++ b/VirtoCommerce.Storefront/Models/ResetCacheModel.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VirtoCommerce.Storefront.Models +{ + /// + /// Cache Event Model For Web Hook from Virto Commmerce Platform + /// + public class ResetCacheEventModel + { + public string EventId { get; set; } + + public ResetCacheEventBodyModel[] EventBody { get; set; } + } + + public class ResetCacheEventBodyModel + { + public string ObjectType { get; set; } + + public string Id { get; set; } + + public string Path { get; set; } + + public string Type { get; set; } + } +} diff --git a/VirtoCommerce.Storefront/VirtoCommerce.Storefront.csproj b/VirtoCommerce.Storefront/VirtoCommerce.Storefront.csproj index 9f20c5c7..10756cc5 100644 --- a/VirtoCommerce.Storefront/VirtoCommerce.Storefront.csproj +++ b/VirtoCommerce.Storefront/VirtoCommerce.Storefront.csproj @@ -6,8 +6,8 @@ 0cd403c4-2cd0-42b3-987a-02900f4a683e The storefront implementation of the Virto Commerce platform. https://virtocommerce.com/open-source-license - https://github.com/VirtoCommerce/vc-storefront-core - https://github.com/VirtoCommerce/vc-storefront-core + https://github.com/VirtoCommerce/vc-storefront + https://github.com/VirtoCommerce/vc-storefront https://virtocommerce.com/themes/assets/logo.jpg @@ -47,10 +47,10 @@ - - + + - + From 6802c3d0f7ac41390132009fa020e04ca09f417b Mon Sep 17 00:00:00 2001 From: Andrew Orlov Date: Wed, 9 Nov 2022 16:07:27 +0200 Subject: [PATCH 4/4] feat: enable Brotli response compression (#631) --- VirtoCommerce.Storefront/Startup.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/VirtoCommerce.Storefront/Startup.cs b/VirtoCommerce.Storefront/Startup.cs index f87f9147..dbf4f9cb 100644 --- a/VirtoCommerce.Storefront/Startup.cs +++ b/VirtoCommerce.Storefront/Startup.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text.Encodings.Web; using System.Text.Unicode; +using System.IO.Compression; using FluentValidation.AspNetCore; using GraphQL.Client.Abstractions; using GraphQL.Client.Http; @@ -21,6 +22,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Microsoft.Extensions.WebEncoders; +using Microsoft.AspNetCore.ResponseCompression; using Microsoft.OpenApi.Models; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; @@ -326,7 +328,13 @@ public void ConfigureServices(IServiceCollection services) c.CustomSchemaIds(type => (Attribute.GetCustomAttribute(type, typeof(SwaggerSchemaIdAttribute)) as SwaggerSchemaIdAttribute)?.Id ?? type.FriendlyId()); }); - services.AddResponseCompression(); + services.Configure(options => { + options.Level = CompressionLevel.Optimal; + }); + services.AddResponseCompression(options => { + options.EnableForHttps = true; + options.Providers.Add(); + }); services.AddProxy(builder => builder.AddHttpMessageHandler(sp => sp.GetService().CreateAuthHandler()));