Replaced Swagger and MediatR implementations with inhouse nuget packages

master
Tudor Stanciu 2020-12-20 23:00:04 +02:00
parent a7cda905bc
commit e3ce6fc694
18 changed files with 30 additions and 240 deletions

View File

@ -1,7 +1,7 @@
<Project> <Project>
<Import Project="dependencies.props" /> <Import Project="dependencies.props" />
<PropertyGroup> <PropertyGroup>
<Version>1.0.0.1</Version> <Version>1.0.2.0</Version>
<Authors>Tudor Stanciu</Authors> <Authors>Tudor Stanciu</Authors>
<Company>STA</Company> <Company>STA</Company>
<PackageTags>NetworkResurrector</PackageTags> <PackageTags>NetworkResurrector</PackageTags>

View File

@ -11,6 +11,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="$(MicrosoftExtensionsPackageVersion)" /> <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsPackageVersion)" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.5" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.5" />
<PackageReference Include="NDB.Extensions.Swagger" Version="$(NDBExtensionsPackageVersion)" />
<PackageReference Include="Serilog.AspNetCore" Version="$(SerilogPackageVersion)" /> <PackageReference Include="Serilog.AspNetCore" Version="$(SerilogPackageVersion)" />
<PackageReference Include="Serilog.Extensions.Logging" Version="$(SerilogExtensionsPackageVersion)" /> <PackageReference Include="Serilog.Extensions.Logging" Version="$(SerilogExtensionsPackageVersion)" />
<PackageReference Include="Serilog.Sinks.Console" Version="$(SerilogSinksConsolePackageVersion)" /> <PackageReference Include="Serilog.Sinks.Console" Version="$(SerilogSinksConsolePackageVersion)" />

View File

@ -7,9 +7,9 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using NDB.Extensions.Swagger;
using NetworkResurrector.Api.Authentication; using NetworkResurrector.Api.Authentication;
using NetworkResurrector.Api.Extensions; using NetworkResurrector.Api.Extensions;
using NetworkResurrector.Api.Swagger;
using NetworkResurrector.Application; using NetworkResurrector.Application;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Reflection; using System.Reflection;
@ -45,7 +45,7 @@ namespace NetworkResurrector.Api
typeof(Application.Mappings.MappingProfile).Assembly); typeof(Application.Mappings.MappingProfile).Assembly);
// Swagger // Swagger
services.AddSwagger(); services.AddSwagger("NetworkResurrector API");
// Application // Application
services.AddApplicationServices(); services.AddApplicationServices();
@ -75,7 +75,7 @@ namespace NetworkResurrector.Api
{ {
endpoints.MapControllers(); endpoints.MapControllers();
}); });
app.ConfigureSwagger(); app.ConfigureSwagger("NetworkResurrector API");
} }
private Assembly[] GetMediatRAssemblies() private Assembly[] GetMediatRAssemblies()

View File

@ -1,36 +0,0 @@
using Microsoft.OpenApi.Models;
using NetworkResurrector.Application.Commands;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;
namespace NetworkResurrector.Api.Swagger
{
public class DtoSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
var targetType = context.Type;
while (targetType != null)
{
if (typeof(ICommand).IsAssignableFrom(targetType))
{
foreach (var property in schema.Properties.ToList())
{
property.Value.ReadOnly = false;
switch (property.Key)
{
case "metadata":
schema.Properties.Remove(property.Key);
break;
default:
break;
}
}
}
targetType = targetType.DeclaringType;
}
}
}
}

View File

@ -1,34 +0,0 @@
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace NetworkResurrector.Api.Swagger
{
public class PathParamsOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
const string paramCaptureGroup = "param";
var openApiPathParameters = operation.Parameters.Where(param => param.In == ParameterLocation.Path).ToList();
var pathParamRegEx = $@"\{{(?<{paramCaptureGroup}>[^\}}]+)\}}";
if (openApiPathParameters.Any())
{
var pathParameterMatches = Regex.Matches(context.ApiDescription.RelativePath, pathParamRegEx, RegexOptions.Compiled);
var pathParameters = pathParameterMatches.Select(x => x.Groups[paramCaptureGroup].Value);
foreach (var openApiPathParameter in openApiPathParameters)
{
var correspondingPathParameter = pathParameters.FirstOrDefault(x =>
string.Equals(x, openApiPathParameter.Name, StringComparison.InvariantCultureIgnoreCase));
if (correspondingPathParameter != null)
openApiPathParameter.Name = correspondingPathParameter;
}
}
}
}
}

View File

@ -1,114 +0,0 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using System.Collections.Generic;
using System.Linq;
namespace NetworkResurrector.Api.Swagger
{
public static class SwaggerExtensions
{
public static IServiceCollection AddSwagger(this IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1",
new OpenApiInfo
{
Title = "NetworkResurrector API",
Version = "v1"
});
c.AddSecurityDefinition("Basic",
new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Description = @"JWT Authorization header using the Basic scheme. Enter 'Basic' [space] and then your token in the text input below. Example: 'Basic 12345abcdef'",
Name = "Authorization",
Scheme = "Basic",
Type = SecuritySchemeType.ApiKey
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Basic"
},
Scheme = "Basic",
Name = "Authorization",
In = ParameterLocation.Header
},
new List<string>()
}
});
c.OperationFilter<PathParamsOperationFilter>();
c.SchemaFilter<DtoSchemaFilter>();
c.CustomSchemaIds(type => type.ToString());
});
return services;
}
public static IApplicationBuilder ConfigureSwagger(this IApplicationBuilder applicationBuilder)
{
applicationBuilder.UseSwagger(c =>
{
c.PreSerializeFilters.Add((swagger, httpRequest) =>
{
var (host, basePath, scheme) = GetUrlComponents(httpRequest);
swagger.Servers = new List<OpenApiServer>
{
new OpenApiServer {Url = $"{scheme}://{host}{basePath}"}
};
});
c.RouteTemplate = "swagger/{documentName}/swagger.json";
});
applicationBuilder.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("v1/swagger.json", "NetworkResurrector API");
c.RoutePrefix = $"swagger";
});
return applicationBuilder;
}
private static (string host, string basePath, string scheme) GetUrlComponents(HttpRequest request)
{
var host = ExtractHost(request);
var basePath = ExtractBasePath(request);
var scheme = ExtractScheme(request);
return (host, basePath, scheme);
}
private static string ExtractHost(HttpRequest request)
{
if (request.Headers.ContainsKey("X-Forwarded-Host"))
return request.Headers["X-Forwarded-Host"].First();
return request.Host.Value;
}
private static string ExtractBasePath(HttpRequest request)
{
if (request.Headers.ContainsKey("X-Forwarded-PathBase"))
return request.Headers["X-Forwarded-PathBase"].First();
return string.Empty;
}
private static string ExtractScheme(HttpRequest request)
{
return request.Headers["X-Forwarded-Proto"].FirstOrDefault() ?? request.Scheme;
}
}
}

View File

@ -1,18 +0,0 @@
using MediatR;
namespace NetworkResurrector.Application.Commands
{
public abstract class Command<TResponse> : ICommand, IRequest<TResponse>
{
public Metadata Metadata { get; }
protected Command(Metadata metadata)
{
Metadata = metadata;
}
}
public interface ICommand
{
}
}

View File

@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
namespace NetworkResurrector.Application.Commands
{
public class Metadata : Dictionary<string, string>
{
public const string CorrelationIdKey = "CorrelationId";
public Guid CorrelationId
{
get
{
return Guid.Parse(this[CorrelationIdKey]);
}
set
{
if (ContainsKey(CorrelationIdKey))
this[CorrelationIdKey] = value.ToString();
else
Add(CorrelationIdKey, value.ToString());
}
}
}
}

View File

@ -1,4 +1,5 @@
using NetworkResurrector.Application.Events; using NDB.Application.DataContracts;
using NetworkResurrector.Application.Events;
using System; using System;
namespace NetworkResurrector.Application.Commands namespace NetworkResurrector.Application.Commands

View File

@ -1,4 +1,5 @@
using NetworkResurrector.Application.Events; using NDB.Application.DataContracts;
using NetworkResurrector.Application.Events;
using System; using System;
namespace NetworkResurrector.Application.Commands namespace NetworkResurrector.Application.Commands

View File

@ -1,4 +1,5 @@
using NetworkResurrector.Application.Events; using NDB.Application.DataContracts;
using NetworkResurrector.Application.Events;
using System; using System;
namespace NetworkResurrector.Application.Commands namespace NetworkResurrector.Application.Commands

View File

@ -11,6 +11,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="$(MicrosoftExtensionsPackageVersion)" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftExtensionsPackageVersion)" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsPackageVersion)" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageReference Include="NDB.Application.DataContracts" Version="$(NDBApplicationPackageVersion)" />
<PackageReference Include="System.Management" Version="5.0.0" /> <PackageReference Include="System.Management" Version="5.0.0" />
</ItemGroup> </ItemGroup>

View File

@ -1,5 +1,6 @@
using AutoMapper; using AutoMapper;
using MediatR; using MediatR;
using NDB.Application.DataContracts;
using NetworkResurrector.Application.Services; using NetworkResurrector.Application.Services;
using System; using System;
using System.Threading; using System.Threading;

View File

@ -1,6 +0,0 @@
using MediatR;
namespace NetworkResurrector.Application.Queries
{
public abstract class Query<TResponse> : IRequest<TResponse>, IBaseRequest { }
}

View File

@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
dependencies.props = dependencies.props dependencies.props = dependencies.props
Directory.Build.props = Directory.Build.props Directory.Build.props = Directory.Build.props
Notes.txt = Notes.txt Notes.txt = Notes.txt
NuGet.config = NuGet.config
ReleaseNotes.xml = ReleaseNotes.xml ReleaseNotes.xml = ReleaseNotes.xml
EndProjectSection EndProjectSection
EndProject EndProject

8
NuGet.config Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="sta.nuget" value="http://***REMOVED***/nugetserver/nuget" />
</packageSources>
</configuration>

View File

@ -13,4 +13,10 @@
Has been added "ping" and "shutdown" support. Routes with same names have also been added to the controller. Has been added "ping" and "shutdown" support. Routes with same names have also been added to the controller.
</Content> </Content>
</Note> </Note>
<Note>
<Version>1.0.2.0</Version>
<Content>
Replaced Swagger and MediatR implementations with inhouse nuget packages.
</Content>
</Note>
</ReleaseNotes> </ReleaseNotes>

View File

@ -9,5 +9,7 @@
<AutoMapperExtensionsPackageVersion>7.0.0</AutoMapperExtensionsPackageVersion> <AutoMapperExtensionsPackageVersion>7.0.0</AutoMapperExtensionsPackageVersion>
<MediatRPackageVersion>6.0.0</MediatRPackageVersion> <MediatRPackageVersion>6.0.0</MediatRPackageVersion>
<SwashbucklePackageVersion>5.3.1</SwashbucklePackageVersion> <SwashbucklePackageVersion>5.3.1</SwashbucklePackageVersion>
<NDBExtensionsPackageVersion>1.0.0</NDBExtensionsPackageVersion>
<NDBApplicationPackageVersion>1.0.0</NDBApplicationPackageVersion>
</PropertyGroup> </PropertyGroup>
</Project> </Project>