public static SimpleApiDescription Simplify(this ApiDescription apiDescription, HttpConfiguration config) { var href = config.ToAbsolute(apiDescription.Route.RouteTemplate); var controllerName = apiDescription.ActionDescriptor.ControllerDescriptor.ControllerName; var actionName = apiDescription.ActionDescriptor.ActionName; var documentationProvider = config.Services.GetDocumentationProviderEx(); var parameters = apiDescription.ParameterDescriptions.SelectMany(pd => Flatten(apiDescription, pd, documentationProvider)).ToList(); href = href.Replace("{action}", actionName.ToLowerInvariant()) .Replace("{controller}", controllerName.ToLowerInvariant()) .Replace("{*", "{"); href = RemoveOptionalRouteParameters(href, parameters); var simpleApi = new SimpleApiDescription { Href = href, Name = actionName, Method = apiDescription.HttpMethod.Method, Documentation = apiDescription.Documentation, Parameters = parameters }; AddAuthenticationInfo(simpleApi, apiDescription); return(simpleApi); }
/// <summary> /// Creates a section tag with nested elements containing /// either a link or a form that points to the <paramref name="api"/> /// URL. /// </summary> public virtual XElement BuildApi(SimpleApiDescription api, SerializationContext context) { var children = new List <object>(); children.Add(new XAttribute("class", "api")); children.Add(new XElement("h2", new XText(api.Name))); children.Add(new XElement("p", new XAttribute("class", "api-endpoint"), new XElement("code", new XText(api.Method + " " + api.Href)))); if (api.Documentation != null) { children.AddRange(ParseDocumentation(api.Documentation)); } if (api.Parameters.Any() || !string.Equals(api.Method, "get", StringComparison.InvariantCultureIgnoreCase)) { children.Add(BuildForm(api, context)); } else { children.Add( new XElement("div", new XElement("a", new XAttribute("href", api.Href), new XAttribute("rel", api.Name), new XText(api.Name)))); } return(new XElement("section", children)); }
/// <summary> /// Build a form tag with nested labels and inputs. /// </summary> /// <param name="api"></param> /// <param name="context"></param> /// <returns></returns> public virtual XElement BuildForm(SimpleApiDescription api, SerializationContext context) { var formName = context.FormatPropertyName(api.Name); return(new XElement("form", new XAttribute("name", formName), new XAttribute("action", api.Href), new XAttribute("method", api.Method), new XAttribute("data-templated", api.Templated), new XAttribute("data-rel", formName), new XAttribute("data-requires-authentication", api.RequiresAuthentication), BuildFormInputs(api, context))); }
private static void AddAuthenticationInfo(SimpleApiDescription simpleApi, ApiDescription apiDescription) { var authorizeAttributes = apiDescription.ActionDescriptor.GetCustomAttributes <AuthorizeAttribute>(true) .Union(apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes <AuthorizeAttribute>(true)); if (authorizeAttributes.Any()) { simpleApi.RequiresAuthentication = true; } simpleApi.RequiresRoles = authorizeAttributes .Where(attr => !string.IsNullOrWhiteSpace(attr.Roles)) .Select(attr => attr.Roles.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(r => r.Trim())); }
/// <summary> /// Add a <see cref="SimpleApiDescription"/> to a list grouped by resource name. /// </summary> public void Add(string resourceName, SimpleApiDescription api) { var resource = resources.FirstOrDefault(r => r.Key == resourceName); if (resource.Key == null) { var apiGroup = new SimpleApiGroup { Name = resourceName }; resource = new KeyValuePair <string, SimpleApiGroup>(resourceName, apiGroup); resources.Add(resource); } resource.Value.AddAction(api); }
/// <summary> /// Creates an label tag with a nested input tag for each parameter /// on <paramref name="api"/>. /// </summary> public virtual IEnumerable <XNode> BuildFormInputs(SimpleApiDescription api, SerializationContext context) { foreach (var p in api.Parameters) { var name = context.FormatPropertyName(p.Name); if (!string.IsNullOrEmpty(p.Documentation)) { yield return(new XElement("p", new XAttribute("class", "api-documentation"), ParseDocumentation(p.Documentation))); } if (p.CallingConvention != "unknown") { var dataAttrs = new List <XAttribute> { new XAttribute("data-required", !p.IsOptional && !p.IsMany), new XAttribute("data-calling-convention", p.CallingConvention) }; if (p.IsMany) { dataAttrs.Add(new XAttribute("data-allow-multiple", "true")); } var input = BuildInput(name, p); input.Add(dataAttrs); yield return(new XElement("label", new XText(name), input)); } else { yield return(new XElement("p", new XAttribute("class", "unknown-calling-convention"), new XText("The parameter "), new XElement("code", new XText(name)), new XText(" cannot be sumbitted through this form because it has an unrecognized calling convention."))); } } yield return(new XElement("input", new XAttribute("type", "submit"))); }
public void AddAction(SimpleApiDescription api) { actions.Add(api); }