-
Notifications
You must be signed in to change notification settings - Fork 0
/
CommandToApiEndpointFilter.cs
71 lines (53 loc) · 3.24 KB
/
CommandToApiEndpointFilter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace TNArch.Microservices.Infrastructure.Common.OpenApi
{
public class CommandToApiEndpointFilter : IDocumentFilter
{
private readonly IOperationToApiMapper _commandToApiMapper;
public CommandToApiEndpointFilter(IOperationToApiMapper commandToApiMapper)
{
_commandToApiMapper = commandToApiMapper;
}
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.Paths.Clear();
var commandToApiMaps = _commandToApiMapper.GetRequestMap();
foreach (var commandToApiMap in commandToApiMaps)
{
var responseSchema = context.SchemaGenerator.GenerateSchema(commandToApiMap.ResponseType, context.SchemaRepository);
var response = new OpenApiResponses { { "200", new OpenApiResponse { Content = new Dictionary<string, OpenApiMediaType> { { "applicaiton/json", new OpenApiMediaType { Schema = responseSchema } } } } } };
var apiPath = new OpenApiPathItem { Operations = new Dictionary<OperationType, OpenApiOperation> { { commandToApiMap.OperationType, new OpenApiOperation { Responses = response } } } };
if (commandToApiMap.OperationType == OperationType.Get)
{
var schemaRepository = new SchemaRepository();
var requestSchema = context.SchemaGenerator.GenerateSchema(commandToApiMap.RequestType, schemaRepository);
var parameters = GetQueryParameters(requestSchema, schemaRepository);
apiPath.Operations[commandToApiMap.OperationType].Parameters = parameters;
}
else
{
var requestSchema = context.SchemaGenerator.GenerateSchema(commandToApiMap.RequestType, context.SchemaRepository);
apiPath.Operations[commandToApiMap.OperationType].RequestBody = new OpenApiRequestBody { Content = new Dictionary<string, OpenApiMediaType> { { "applicaiton/json", new OpenApiMediaType { Schema = requestSchema } } } };
}
swaggerDoc.Paths.Add($"/api/{commandToApiMap.RequestName}", apiPath);
}
}
private static List<OpenApiParameter> GetQueryParameters(OpenApiSchema requestSchema, SchemaRepository schemaRepository, string prefix = null)
{
var schema = schemaRepository.Schemas[requestSchema.Reference.Id];
if (schema.Enum.Any())
return new List<OpenApiParameter> { new OpenApiParameter { In = ParameterLocation.Query, Name = prefix, Schema = schema } };
var primitiveTypes = schema.Properties.Where(p => p.Value.Type != null);
if (prefix != null)
prefix = $"{prefix}.";
var nestedTypes = schema.Properties
.Except(primitiveTypes)
.SelectMany(p => GetQueryParameters(p.Value, schemaRepository, $"{prefix}{p.Key}"));
return primitiveTypes
.Select(p => new OpenApiParameter { In = ParameterLocation.Query, Name = $"{prefix}{p.Key}", Schema = p.Value })
.Union(nestedTypes)
.ToList();
}
}
}