Line data Source code
1 : using System.Collections.Generic;
2 : using System.Linq;
3 : using System.Net;
4 : using System.Net.Http;
5 : using System.Text;
6 : using System.Web.Http;
7 : using System.Web.Http.Description;
8 :
9 : namespace Cqrs.WebApi.Controllers
10 : {
11 : [RoutePrefix("Client")]
12 : public class ClientController : ApiController
13 0 : {
14 : [Route("")]
15 : [HttpGet]
16 0 : public virtual HttpResponseMessage Index()
17 : {
18 : var apiExplorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
19 : var apiMethods = apiExplorer.ApiDescriptions.Select(ad => new ApiMethodModel(ad)).ToList();
20 :
21 : string host = Url.Content(Request.RequestUri.AbsoluteUri.Substring(0, Request.RequestUri.AbsoluteUri.Length - Request.RequestUri.AbsolutePath.Length));
22 : string path = Url.Content("~/");
23 : if (path.StartsWith(host))
24 : host = null;
25 :
26 : var responseBody = string.Format(@"window.api = window.api || {{
27 : metadata: {0},
28 : useJson: true
29 : }};
30 :
31 : $.each(window.api.metadata, function (i, action)
32 : {{
33 : if (!window.api[action.ControllerName])
34 : {{
35 : window.api[action.ControllerName] = {{}};
36 : }}
37 : window.api[action.ControllerName][action.ActionName] = function (parameters)
38 : {{
39 : var url = '{1}{2}' + action.Url;
40 : var data = [];
41 :
42 : if (action.Parameters.length == 1 && action.Parameters[0].Name == 'parameters')
43 : {{
44 : data = parameters;
45 : }}
46 : else if (action.Parameters.length == 2 && action.Parameters[0].Name == 'entity' && action.Parameters[1].Name == 'rsn')
47 : {{
48 : url = url.substring(0, url.length - 5) + parameters['Rsn'];
49 : data = parameters;
50 : }}
51 : else
52 : {{
53 : $.each(action.Parameters, function (j, parameter)
54 : {{
55 : if (parameters[parameter.Name] === undefined)
56 : {{
57 : console.error('Missing parameter: ' + parameter.Name + ' for API: ' + action.ControllerName + '/' + action.ActionName);
58 : }}
59 : else if (parameter.IsUriParameter)
60 : {{
61 : url = url.replace('{{' + parameter.Name + '}}', parameters[parameter.Name]);
62 : }}
63 : else if (data[parameter.Name] === undefined)
64 : {{
65 : data[parameter.Name] = parameters[parameter.Name];
66 : }}
67 : else
68 : {{
69 : console.error('Detected multiple body-parameters for API: ' + action.ControllerName + '/' + action.ActionName);
70 : }}
71 : }});
72 : }}
73 :
74 : if (window.api.useJson)
75 : return $.ajax({{
76 : type: action.Method,
77 : url: url,
78 : data: JSON.stringify(data),
79 : contentType: 'application/json'
80 : }});
81 : return $.ajax({{
82 : type: action.Method,
83 : url: url,
84 : data: data
85 : }});
86 : }};
87 : }});",
88 : System.Web.Helpers.Json.Encode(apiMethods),
89 : host,
90 : path);
91 :
92 : HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseBody);
93 : response.Content = new StringContent(responseBody, Encoding.UTF8, "application/javascript");
94 : return response;
95 : }
96 :
97 : public class ApiMethodModel
98 0 : {
99 : public string Method { get; set; }
100 : public string Url { get; set; }
101 : public string ControllerName { get; set; }
102 : public string ActionName { get; set; }
103 : public IEnumerable<ApiParameterModel> Parameters { get; set; }
104 :
105 0 : public ApiMethodModel(ApiDescription apiDescription)
106 : {
107 : Method = apiDescription.HttpMethod.Method;
108 : Url = apiDescription.RelativePath;
109 : ControllerName = apiDescription.ActionDescriptor.ControllerDescriptor.ControllerName;
110 : ActionName = apiDescription.ActionDescriptor.ActionName;
111 : Parameters = apiDescription.ParameterDescriptions.Select(pd => new ApiParameterModel(pd));
112 : }
113 : }
114 :
115 : public class ApiParameterModel
116 0 : {
117 : public string Name { get; set; }
118 : public bool IsUriParameter { get; set; }
119 :
120 0 : public ApiParameterModel(ApiParameterDescription apiParameterDescription)
121 : {
122 : Name = apiParameterDescription.Name;
123 : IsUriParameter = apiParameterDescription.Source == ApiParameterSource.FromUri;
124 : }
125 : }
126 : }
127 : }
128 :
|