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 @@
-
-
+
+
-
+