diff --git a/Directory.Packages.props b/Directory.Packages.props
index ab25cfd27..b2786b10f 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -36,8 +36,7 @@
-
-
+
diff --git a/src/Modules/Grand.Module.Api/Controllers/BrandController.cs b/src/Modules/Grand.Module.Api/Controllers/BrandController.cs
index 7d22fec2f..2bfc81ef2 100644
--- a/src/Modules/Grand.Module.Api/Controllers/BrandController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/BrandController.cs
@@ -5,7 +5,7 @@
using Grand.Domain.Permissions;
using Grand.Domain.Catalog;
using MediatR;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Grand.Module.Api.Attributes;
diff --git a/src/Modules/Grand.Module.Api/Controllers/CategoryController.cs b/src/Modules/Grand.Module.Api/Controllers/CategoryController.cs
index 0d1303617..c41b54cd3 100644
--- a/src/Modules/Grand.Module.Api/Controllers/CategoryController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/CategoryController.cs
@@ -5,7 +5,7 @@
using Grand.Domain.Permissions;
using Grand.Domain.Catalog;
using MediatR;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Grand.Module.Api.Attributes;
using Microsoft.AspNetCore.Http;
diff --git a/src/Modules/Grand.Module.Api/Controllers/CollectionController.cs b/src/Modules/Grand.Module.Api/Controllers/CollectionController.cs
index 036645b39..e396d3cbf 100644
--- a/src/Modules/Grand.Module.Api/Controllers/CollectionController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/CollectionController.cs
@@ -7,7 +7,7 @@
using Grand.Module.Api.Queries.Models.Common;
using MediatR;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
diff --git a/src/Modules/Grand.Module.Api/Controllers/CustomerGroupController.cs b/src/Modules/Grand.Module.Api/Controllers/CustomerGroupController.cs
index 7f7080181..286b754b6 100644
--- a/src/Modules/Grand.Module.Api/Controllers/CustomerGroupController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/CustomerGroupController.cs
@@ -7,7 +7,7 @@
using Grand.Module.Api.Queries.Models.Common;
using MediatR;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
diff --git a/src/Modules/Grand.Module.Api/Controllers/ProductAttributeController.cs b/src/Modules/Grand.Module.Api/Controllers/ProductAttributeController.cs
index e932377f0..1122c1ceb 100644
--- a/src/Modules/Grand.Module.Api/Controllers/ProductAttributeController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/ProductAttributeController.cs
@@ -7,7 +7,7 @@
using Grand.Module.Api.Queries.Models.Common;
using MediatR;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
diff --git a/src/Modules/Grand.Module.Api/Controllers/ProductController.cs b/src/Modules/Grand.Module.Api/Controllers/ProductController.cs
index d70465307..9ec2af815 100644
--- a/src/Modules/Grand.Module.Api/Controllers/ProductController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/ProductController.cs
@@ -7,7 +7,7 @@
using Grand.Module.Api.Queries.Models.Common;
using MediatR;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
diff --git a/src/Modules/Grand.Module.Api/Controllers/SpecificationAttributeController.cs b/src/Modules/Grand.Module.Api/Controllers/SpecificationAttributeController.cs
index 7836c3a1e..4c7dca241 100644
--- a/src/Modules/Grand.Module.Api/Controllers/SpecificationAttributeController.cs
+++ b/src/Modules/Grand.Module.Api/Controllers/SpecificationAttributeController.cs
@@ -7,7 +7,7 @@
using Grand.Module.Api.Queries.Models.Common;
using MediatR;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.JsonPatch;
+using Microsoft.AspNetCore.JsonPatch.SystemTextJson;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
diff --git a/src/Modules/Grand.Module.Api/Extensions/ServiceCollectionExtensions.cs b/src/Modules/Grand.Module.Api/Extensions/ServiceCollectionExtensions.cs
index c9195e699..6afdfbcee 100644
--- a/src/Modules/Grand.Module.Api/Extensions/ServiceCollectionExtensions.cs
+++ b/src/Modules/Grand.Module.Api/Extensions/ServiceCollectionExtensions.cs
@@ -13,30 +13,12 @@
using Grand.Module.Api.Queries.Handlers.Common;
using Grand.Module.Api.Queries.Models.Common;
using MediatR;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
namespace Grand.Module.Api.Infrastructure.Extensions
{
public static class ServiceCollectionExtensions
{
- public static NewtonsoftJsonPatchInputFormatter GetJsonPatchInputFormatter(this IServiceCollection services)
- {
- var builder = new ServiceCollection()
- .AddLogging()
- .AddMvc()
- .AddNewtonsoftJson()
- .Services.BuildServiceProvider();
-
- return builder
- .GetRequiredService>()
- .Value
- .InputFormatters
- .OfType()
- .First();
- }
public static void RegisterRequestHandler(this IServiceCollection services)
{
var handlerTypes = new (Type dto, Type entity)[]
diff --git a/src/Modules/Grand.Module.Api/Grand.Module.Api.csproj b/src/Modules/Grand.Module.Api/Grand.Module.Api.csproj
index c1fc46b3d..765ced4aa 100644
--- a/src/Modules/Grand.Module.Api/Grand.Module.Api.csproj
+++ b/src/Modules/Grand.Module.Api/Grand.Module.Api.csproj
@@ -41,8 +41,7 @@
-
-
+
diff --git a/src/Modules/Grand.Module.Api/Infrastructure/OpenApiStartup.cs b/src/Modules/Grand.Module.Api/Infrastructure/OpenApiStartup.cs
index e7606dfed..746cc2c6d 100644
--- a/src/Modules/Grand.Module.Api/Infrastructure/OpenApiStartup.cs
+++ b/src/Modules/Grand.Module.Api/Infrastructure/OpenApiStartup.cs
@@ -54,11 +54,6 @@ public void ConfigureServices(IServiceCollection services, IConfiguration config
//register RequestHandler
services.RegisterRequestHandler();
- //Add JsonPatchInputFormatter
- services.AddControllers(options =>
- {
- options.InputFormatters.Insert(0, services.GetJsonPatchInputFormatter());
- });
services.AddScoped();
}
}
diff --git a/src/Modules/Grand.Module.Api/Infrastructure/Transformers/IgnoreFieldSchemaTransformer.cs b/src/Modules/Grand.Module.Api/Infrastructure/Transformers/IgnoreFieldSchemaTransformer.cs
index 91e0b80b3..c81f90f8d 100644
--- a/src/Modules/Grand.Module.Api/Infrastructure/Transformers/IgnoreFieldSchemaTransformer.cs
+++ b/src/Modules/Grand.Module.Api/Infrastructure/Transformers/IgnoreFieldSchemaTransformer.cs
@@ -11,8 +11,8 @@ public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext
{
var type = context.JsonTypeInfo.Type;
- if (!schema.Properties.Any() || type == null) return Task.CompletedTask;
-
+ if (type == null || schema.Properties == null || !schema.Properties.Any()) return Task.CompletedTask;
+
var excludedPropertyNames = type
.GetProperties()
.Where(
@@ -26,7 +26,7 @@ public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext
ap => excludedPropertyNames.Any(
pn => pn.Equals(ap.Key, StringComparison.InvariantCultureIgnoreCase)
)
- ).Select(ap => ap.Key);
+ ).Select(ap => ap.Key).ToList();
foreach (var propertyToExclude in excludedSchemaPropertyKey) schema.Properties.Remove(propertyToExclude);
diff --git a/src/Web/Grand.Web/App_Data/appsettings.json b/src/Web/Grand.Web/App_Data/appsettings.json
index cb55d2d4a..7ca546b1b 100644
--- a/src/Web/Grand.Web/App_Data/appsettings.json
+++ b/src/Web/Grand.Web/App_Data/appsettings.json
@@ -171,6 +171,8 @@
"ClientSecret": ""
},
//access to the api to web controllers
+ //when enabled (Development environment only), API documentation (Scalar) is available at: https://your-domain/scalar/v2
+ //locally: https://localhost:44350/scalar/v2
"FrontendAPI": {
"Enabled": true,
"JsonContentType": false,
@@ -186,6 +188,8 @@
"RefreshTokenExpiryInMinutes": 1440
},
//api for admin
+ //when enabled (Development environment only), API documentation (Scalar) is available at: https://your-domain/scalar/v1
+ //locally: https://localhost:44350/scalar/v1
"BackendAPI": {
"Enabled": true,
"SecretKey": "your private secret key to use api",