Example #1
0
        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);
        }
Example #2
0
        /// <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));
        }
Example #3
0
        /// <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)));
        }
Example #4
0
        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()));
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <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")));
        }
Example #7
0
 public void AddAction(SimpleApiDescription api)
 {
     actions.Add(api);
 }