diff --git a/src/Api/Startup.cs b/src/Api/Startup.cs index b1678b822b..745331f9c1 100644 --- a/src/Api/Startup.cs +++ b/src/Api/Startup.cs @@ -14,7 +14,6 @@ using Stripe; using Bit.Core.Utilities; using IdentityModel; using Microsoft.AspNetCore.HttpOverrides; -using Swashbuckle.AspNetCore.Swagger; namespace Bit.Api { @@ -112,9 +111,16 @@ namespace Bit.Api services.AddMvc(config => { config.Conventions.Add(new ApiExplorerGroupConvention()); + config.Conventions.Add(new PublicApiControllersModelConvention()); config.Filters.Add(new ExceptionHandlerFilterAttribute()); config.Filters.Add(new ModelStateValidationFilterAttribute()); - }).AddJsonOptions(o => o.SerializerSettings.ContractResolver = new DefaultContractResolver()); + }).AddJsonOptions(options => + { + if(Configuration["swaggerGen"] != "true") + { + options.SerializerSettings.ContractResolver = new DefaultContractResolver(); + } + }); services.AddSwagger(globalSettings); @@ -186,8 +192,8 @@ namespace Bit.Api // Add MVC to the request pipeline. app.UseMvc(); - - if(true || globalSettings.SelfHosted) + + if(globalSettings.SelfHosted) { app.UseSwagger(config => { diff --git a/src/Api/Utilities/CamelCaseJsonResultFilterAttribute.cs b/src/Api/Utilities/CamelCaseJsonResultFilterAttribute.cs new file mode 100644 index 0000000000..4865de6b0d --- /dev/null +++ b/src/Api/Utilities/CamelCaseJsonResultFilterAttribute.cs @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace Bit.Api.Utilities +{ + public class CamelCaseJsonResultFilterAttribute : IAsyncResultFilter + { + private static JsonSerializerSettings _jsonSerializerSettings; + + static CamelCaseJsonResultFilterAttribute() + { + _jsonSerializerSettings = new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }; + } + + public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) + { + if(context.Result is JsonResult jsonResult) + { + context.Result = new JsonResult(jsonResult.Value, _jsonSerializerSettings); + } + await next(); + } + } +} diff --git a/src/Api/Utilities/PublicApiControllersModelConvention.cs b/src/Api/Utilities/PublicApiControllersModelConvention.cs new file mode 100644 index 0000000000..3ffc42bd78 --- /dev/null +++ b/src/Api/Utilities/PublicApiControllersModelConvention.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc.ApplicationModels; + +namespace Bit.Api.Utilities +{ + public class PublicApiControllersModelConvention : IControllerModelConvention + { + public void Apply(ControllerModel controller) + { + var controllerNamespace = controller.ControllerType.Namespace; + if(controllerNamespace.Contains(".Public.")) + { + controller.Filters.Add(new CamelCaseJsonResultFilterAttribute()); + } + } + } +} diff --git a/src/Api/Utilities/ServiceCollectionExtensions.cs b/src/Api/Utilities/ServiceCollectionExtensions.cs index 492b926ddf..f5105acd44 100644 --- a/src/Api/Utilities/ServiceCollectionExtensions.cs +++ b/src/Api/Utilities/ServiceCollectionExtensions.cs @@ -29,6 +29,9 @@ namespace Bit.Api.Utilities { { "OAuth2 Client Credentials", new[] { "api.organization" } } }); + + config.DescribeAllParametersInCamelCase(); + // config.UseReferencedDefinitionsForEnums(); }); } }