diff --git a/Directory.Build.props b/Directory.Build.props index 311963d13..92da82821 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,11 +3,11 @@ VirtoCommerce - Copyright © VirtoCommerce 2011-2020 + Copyright © VirtoCommerce 2011-2022 VirtoCommerce - 6.6.0 + 6.7.0 $(VersionSuffix)-$(BuildNumber) diff --git a/VirtoCommerce.Storefront.Model/Security/ConfirmEmailModel.cs b/VirtoCommerce.Storefront.Model/Security/ConfirmEmailModel.cs new file mode 100644 index 000000000..d35e6b58e --- /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.sln b/VirtoCommerce.Storefront.sln index e6d362800..1df950271 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/ApiAccountController.cs b/VirtoCommerce.Storefront/Controllers/Api/ApiAccountController.cs index 6697b9683..7616cc6ca 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) { diff --git a/VirtoCommerce.Storefront/Controllers/Api/ApiStaticContentController.cs b/VirtoCommerce.Storefront/Controllers/Api/ApiStaticContentController.cs index 505391502..6d10d3f68 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 517bdf5d9..dc04f9f8c 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 000000000..6768cb069 --- /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/Startup.cs b/VirtoCommerce.Storefront/Startup.cs index f87f91475..dbf4f9cbc 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())); diff --git a/VirtoCommerce.Storefront/VirtoCommerce.Storefront.csproj b/VirtoCommerce.Storefront/VirtoCommerce.Storefront.csproj index 9f20c5c7b..10756cc54 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 @@ - - + + - +