Merge pull request #3889 from bernarden/bug/fixing-documentation-generation-for-swagger

Adds xml documentation generation. Better error handling when xml documentation is missing.
pull/3895/head
Jamie 4 years ago committed by GitHub
commit 21710a503a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,13 +1,9 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.JsonPatch.Operations;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
@ -15,18 +11,16 @@ using Microsoft.OpenApi.Models;
using Ombi.Config; using Ombi.Config;
using Ombi.Helpers; using Ombi.Helpers;
using Ombi.Models.Identity; using Ombi.Models.Identity;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace Ombi namespace Ombi
{ {
public static class StartupExtensions public static class StartupExtensions
{ {
public static void AddSwagger(this IServiceCollection services) public static void AddSwagger(this IServiceCollection services)
{ {
services.AddSwaggerGen(c => services.AddSwaggerGen(c =>
{ {
c.SwaggerDoc("v1", new OpenApiInfo() c.SwaggerDoc("v1", new OpenApiInfo
{ {
Version = "v1", Version = "v1",
Title = "Ombi Api V1", Title = "Ombi Api V1",
@ -37,35 +31,39 @@ namespace Ombi
} }
}); });
c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme
{ {
Description = "API Key provided by Ombi. Example: \"ApiKey: {token}\"", Description = "API Key provided by Ombi. Example: \"ApiKey: {token}\"",
Name = "ApiKey", Name = "ApiKey",
In = ParameterLocation.Header, In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey Type = SecuritySchemeType.ApiKey
}); });
c.CustomSchemaIds(x => x.FullName); c.CustomSchemaIds(x => x.FullName);
var basePath = Path.GetDirectoryName(AppContext.BaseDirectory);
var xmlPath = Path.Combine(basePath, "Swagger.xml");
try try
{ {
c.IncludeXmlComments(xmlPath); string basePath = Path.GetDirectoryName(AppContext.BaseDirectory);
string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
string xmlPath = Path.Combine(basePath ?? string.Empty, $"{assemblyName}.xml");
if (File.Exists(xmlPath))
{
c.IncludeXmlComments(xmlPath);
}
else
{
Console.WriteLine($"Swagger failed to find documentation file at '{xmlPath}'.");
}
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine(e); Console.WriteLine(e);
} }
c.DescribeAllParametersInCamelCase(); c.DescribeAllParametersInCamelCase();
}); });
} }
public static void AddAppSettingsValues(this IServiceCollection services, IConfigurationRoot configuration) public static void AddAppSettingsValues(this IServiceCollection services, IConfigurationRoot configuration)
{ {
services.Configure<ApplicationSettings>(configuration.GetSection("ApplicationSettings")); services.Configure<ApplicationSettings>(configuration.GetSection("ApplicationSettings"));
@ -78,13 +76,10 @@ namespace Ombi
public static void AddJwtAuthentication(this IServiceCollection services, IConfigurationRoot configuration) public static void AddJwtAuthentication(this IServiceCollection services, IConfigurationRoot configuration)
{ {
var tokenOptions = configuration.GetSection("TokenAuthentication");
var tokenValidationParameters = new TokenValidationParameters var tokenValidationParameters = new TokenValidationParameters
{ {
ValidateIssuerSigningKey = true, ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(StartupSingleton.Instance.SecurityKey)), IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(StartupSingleton.Instance.SecurityKey)),
RequireExpirationTime = true, RequireExpirationTime = true,
ValidateLifetime = true, ValidateLifetime = true,
ValidAudience = "Ombi", ValidAudience = "Ombi",
@ -92,33 +87,35 @@ namespace Ombi
ClockSkew = TimeSpan.Zero, ClockSkew = TimeSpan.Zero,
}; };
services.AddAuthentication(options => services
{ .AddAuthentication(options =>
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
x.Audience = "Ombi";
x.TokenValidationParameters = tokenValidationParameters;
x.Events = new JwtBearerEvents
{ {
OnMessageReceived = context => options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.Audience = "Ombi";
x.TokenValidationParameters = tokenValidationParameters;
x.Events = new JwtBearerEvents
{ {
var accessToken = context.Request.Query["access_token"]; OnMessageReceived = context =>
// If the request is for our hub...
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/hubs")))
{ {
// Read the token out of the query string var accessToken = context.Request.Query["access_token"];
context.Token = accessToken;
} // If the request is for our hub...
return Task.CompletedTask; var path = context.HttpContext.Request.Path;
} if (!string.IsNullOrEmpty(accessToken) &&
}; (path.StartsWithSegments("/hubs")))
}); {
// Read the token out of the query string
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
} }
} }
} }

@ -14,6 +14,7 @@
<SpaRoot>ClientApp\</SpaRoot> <SpaRoot>ClientApp\</SpaRoot>
<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes> <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
<TieredCompilationQuickJit>true</TieredCompilationQuickJit> <!--https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation--> <TieredCompilationQuickJit>true</TieredCompilationQuickJit> <!--https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation-->
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>

Loading…
Cancel
Save