-
Notifications
You must be signed in to change notification settings - Fork 7
/
CustomDocumentFilter.cs
84 lines (73 loc) · 3.99 KB
/
CustomDocumentFilter.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
72
73
74
75
76
77
78
79
80
81
82
83
84
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web.Http.OData;
using System.Text;
namespace Something.Helpers
{
public class CustomDocumentFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
Assembly assembly = typeof(ODataController).Assembly;
var thisAssemblyTypes = Assembly.GetExecutingAssembly().GetTypes().ToList();
var odatacontrollers = thisAssemblyTypes.Where(t => t.BaseType == typeof(Microsoft.AspNet.OData.ODataController)).ToList();
var odatamethods = new[] { "Get", "Put", "Post", "Delete" };
foreach (var odataContoller in odatacontrollers) // this the OData controllers in the API
{
var methods = odataContoller.GetMethods().Where(a => odatamethods.Contains(a.Name)).ToList();
if (!methods.Any())
continue; // next controller
foreach (var method in methods) // this is all of the methods in controller (e.g. GET, POST, PUT, etc)
{
StringBuilder sb = new StringBuilder();
sb.Append("/" + method.Name + "(");
List<String> listParams = new List<String>();
var parameterInfo = method.GetParameters();
foreach(ParameterInfo pi in parameterInfo)
{
listParams.Add(pi.ParameterType + " " + pi.Name);
}
sb.Append(String.Join(", ", listParams.ToArray()));
sb.Append(")");
var path = "/" + "api" + "/" + odataContoller.Name.Replace("Controller", "") + sb.ToString();
var odataPathItem = new PathItem();
var op = new Operation();
// The odata methods will be listed under a heading called OData in the swagger doc
op.Tags = new List<string> { "OData" };
op.OperationId = "OData_" + odataContoller.Name.Replace("Controller", "");
// This hard-coded for now, set it to use XML comments if you want
op.Summary = "Summary about method / data";
op.Description = "Description / options for the call.";
op.Consumes = new List<string>();
op.Produces = new List<string> { "application/atom+xml", "application/json", "text/json", "application/xml", "text/xml" };
op.Deprecated = false;
var response = new Response() { Description = "OK" };
response.Schema = new Schema { Type = "array", Items = context.SchemaRegistry.GetOrRegister(method.ReturnType) };
op.Responses = new Dictionary<string, Response> { { "200", response } };
var security = GetSecurityForOperation(odataContoller);
if (security != null)
op.Security = new List<IDictionary<string, IEnumerable<string>>> { security };
odataPathItem.Get = op;
try
{
swaggerDoc.Paths.Add(path, odataPathItem);
}
catch { }
}
}
}
private Dictionary<string, IEnumerable<string>> GetSecurityForOperation(MemberInfo odataContoller)
{
Dictionary<string, IEnumerable<string>> securityEntries = null;
if (odataContoller.GetCustomAttribute(typeof(Microsoft.AspNetCore.Authorization.AuthorizeAttribute)) != null)
{
securityEntries = new Dictionary<string, IEnumerable<string>> { { "oauth2", new[] { "actioncenter" } } };
}
return securityEntries;
}
}
}