/// <summary> /// Generates an URI-friendly ID for the <see cref="T:System.Web.Http.Description.ApiDescription" />. E.g. "Get-Values-id" instead of "GetValues/{id}?name={name}" /// </summary> /// <param name="description">The <see cref="T:System.Web.Http.Description.ApiDescription" />.</param> /// <param name="version">The version of the API controller, if any.</param> /// <returns> /// Returns a URL-friendly id of the API. /// </returns> /// <remarks>The current version removes all optional parameters.</remarks> public static string GetFriendlyId(this System.Web.Http.Description.ApiDescription description, string version = "") { string path = description.RelativePath; string[] urlParts = path.Split('?'); string localPath = urlParts[0].EndsWith("/") ? urlParts[0].Substring(0, urlParts[0].Length - 1).ToLower() : urlParts[0].ToLower(); string queryKeyString = null; StringBuilder friendlyPath = new StringBuilder(); friendlyPath.AppendFormat("{0}-{1}", description.HttpMethod.Method, localPath.Replace("/", "-").Replace("{", String.Empty).Replace("}", String.Empty)); if (queryKeyString != null) { friendlyPath.AppendFormat("_{0}", queryKeyString); } if (!string.IsNullOrEmpty(version)) { friendlyPath.AppendFormat("-{0}", version); } return(friendlyPath.ToString()); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation == null) { throw new ArgumentNullException("operation"); } if (apiDescription == null) { throw new ArgumentNullException("apiDescription"); } Collection <IFilter> filters = apiDescription.ActionDescriptor.ControllerDescriptor.GetFilters(); IEnumerable <IFilter> mobileAppFilter = filters.Where(f => typeof(MobileAppControllerAttribute).IsAssignableFrom(f.GetType())); if (mobileAppFilter.Any()) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } operation.parameters.Add(new Parameter { name = "ZUMO-API-VERSION", @in = "header", type = "string", required = true, @default = "2.0.0" }); } }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } var filterPipeline = apiDescription.ActionDescriptor.GetFilterPipeline(); //判断是否添加方法过滤器 var isActionFilter = filterPipeline.Select(filterInfo => filterInfo.Instance).Any(filter => filter is AuthAttribute); //判断是否允许匿名方法 var allowAnonymous = apiDescription.ActionDescriptor.GetCustomAttributes <AllowAnonymousAttribute>().Any(); if (isActionFilter && !allowAnonymous) { operation.parameters.Add(new Parameter { name = "appkey", @in = "header", description = "appkey", required = false, type = "string", @default = "test" }); operation.parameters.Add(new Parameter { name = "token", @in = "header", description = "token", required = false, type = "string", @default = "test" }); operation.parameters.Add(new Parameter { name = "timestamp", @in = "header", description = "时间戳", required = false, type = "string", @default = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }); operation.parameters.Add(new Parameter { name = "sign", @in = "header", description = "签名", required = false, type = "string", @default = "test" }); } }
/// <summary> /// /// </summary> /// <param name="operation"></param> /// <param name="schemaRegistry"></param> /// <param name="apiDescription"></param> public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } //operation.parameters.Add(new Parameter //{ // //apptype // @in = "header", // name = "apptype",//header name // //@default = "0",//0:Android;1:IOS // description = "应用类型0:未知; 1:Android;2:IOS", // required = true, // type = "string", // @enum = new List<object>() { "0", "1" } //}); //operation.parameters.Add(new Parameter //{ // @in = "header", // name = "ciphertext",//header name // @default = "ciphertext", // description = "密文(app调用时忽略此参数)", // required = true, // type = "string", //}); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } if (System.Configuration.ConfigurationManager.AppSettings["tokenAuth"].ToLower() == "false") { return; } var attributesA = apiDescription.ActionDescriptor.GetCustomAttributes <AllowAnonymousAttribute>().OfType <AllowAnonymousAttribute>(); bool isAnonymousA = attributesA.Any(a => a is AllowAnonymousAttribute); if (isAnonymousA) { return; } operation.parameters.Add(new Parameter() { name = "Authorization", @in = "header", type = "string", description = "tokenхож╓пео╒", required = true }); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { // Add a default response code if (operation != null && operation.responses != null && operation.responses.ContainsKey("200")) { operation.responses.Add("default", operation.responses["200"]); } }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { operation.parameters = operation.parameters ?? new List <Parameter>(); operation.parameters.Add(new Parameter { name = Name, description = Description, @in = In, required = true, type = "string" }); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { var module = _packageService.GetModules().Where(x => x.ModuleInfo.ModuleInstance != null).FirstOrDefault(x => apiDescription.ActionDescriptor.ControllerDescriptor.ControllerType.Assembly == x.ModuleInfo.ModuleInstance.GetType().Assembly); if (module != null) { operation.tags = new string[] { module.Title }; } else if (apiDescription.ActionDescriptor.ControllerDescriptor.ControllerType.Assembly.GetName().Name == "VirtoCommerce.Platform.Web") { operation.tags = new string[] { "VirtoCommerce platform" }; } }
public static bool ResolveVersionSupportByRouteConstraint(System.Web.Http.Description.ApiDescription apiDesc, string targetApiVersion) { //var versionConstraint = (apiDesc.Route.Constraints.ContainsKey("apiVersion")) // ? apiDesc.Route.Constraints["apiVersion"] as RegexRouteConstraint // : null; //return (versionConstraint == null) // ? false // : versionConstraint.Pattern.Split('|').ToList().Contains(targetApiVersion); return(apiDesc.Route.RouteTemplate.Contains(targetApiVersion)); }
/// <summary> /// /// </summary> public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { var attributes = apiDescription.ActionDescriptor.GetCustomAttributes <ResourceAuthorizeAttribute>(); var permissions = new List <string>(); foreach (var attribute in attributes) { var permissionString = String.Format("Requires <strong>{0}</strong> permission on <strong>{1}</strong> resource type.", attribute.Permission.PermissionName, attribute.Permission.ResourceType); operation.description += permissionString; } }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } operation.parameters.Add(new Parameter { name = "Authorization", @in = "header", description = "access token", required = false, type = "string" }); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { //如果方法名里包含upload,则提供一个参数名为file类型为file的参数 if (apiDescription.ActionDescriptor.ActionName.Contains("Upload")) { operation.consumes.Add("application/form-data"); operation.parameters.Add(new Parameter { name = "file", @in = "formData", required = true, type = "file" }); } }
/// <summary> /// Swagger生成token认证 /// </summary> /// <param name="operation"></param> /// <param name="schemaRegistry"></param> /// <param name="apiDescription"></param> public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } //判断是否添加权限过滤器 var filterPipeline = apiDescription.ActionDescriptor.GetFilterPipeline(); //判断是否允许匿名方法 var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Instance).Any(filter => filter is IAuthorizationFilter); var allowAnonymous = apiDescription.ActionDescriptor.GetCustomAttributes <AllowAnonymousAttribute>().Any(); if (isAuthorized && !allowAnonymous) { operation.parameters.Add(new Parameter { name = "Authorization", @in = "header", description = "Token", required = false, type = "string" }); } }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { //FORCE X-MobilePatronsApp-AUTH-TOKEN IN ALL CONTROLLERS EXCEPT: if ((apiDescription.ActionDescriptor).ControllerDescriptor.ControllerType.Name != "AccountController" && (apiDescription.ActionDescriptor).ControllerDescriptor.ControllerType.Name != "LoginController" && (apiDescription.ActionDescriptor).ControllerDescriptor.ControllerType.Name != "ValuesController" && (apiDescription.ActionDescriptor).ControllerDescriptor.ControllerType.Name != "PasswordController" && !apiDescription.RelativePath.Equals("Login/Post")) { if (null == operation.parameters) { operation.parameters = new List <Parameter>(); } // allow user auth token to be sent operation.parameters.Add(new Parameter() { name = "X-PATRONS-AUTH-TOKEN", type = "string", @in = "header", required = true, description = "Identifies logged-in user. Get this from /Account/Login result Token." }); } }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { // Add a dynamic enumeration of the Queues // of course, you can also search based on the presence of custom attributes var param = operation.parameters.FirstOrDefault(x => x.name.Equals("queueName")); if (param != null) { if (param.@enum == null) { param.@enum = new System.Collections.Generic.List <object>(); } foreach (string queueName in this.GetQueues()) { [email protected](queueName); } } }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.parameters == null) { operation.parameters = new List <Parameter>(); } operation.parameters.Add(new Parameter { name = "Authorization", @in = "header", required = false, description = "access bearer token", type = "String", schema = new Schema { type = "String", @default = new OpenApiString("Bearer ") } }); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.operationId.IndexOf("Trigger", StringComparison.InvariantCultureIgnoreCase) >= 0) { // this is a possible trigger var triggerStateParam = operation.parameters.FirstOrDefault(x => x.name.Equals("triggerState")); if (triggerStateParam != null) { if (triggerStateParam.vendorExtensions == null) { triggerStateParam.vendorExtensions = new Dictionary <string, object>(); } // add 2 vendor extensions // x-ms-visibility: set to 'internal' to signify this is an internal field // x-ms-scheduler-recommendation: set to a value that logic app can use triggerStateParam.vendorExtensions.Add("x-ms-visibility", "internal"); triggerStateParam.vendorExtensions.Add("x-ms-scheduler-recommendation", "@coalesce(triggers()?.outputs?.body?['triggerState'], '')"); } } }
private static bool ResolveVersionSupportByRouteConstraint(System.Web.Http.Description.ApiDescription apiDesc, string targetApiVersion) { var attr = apiDesc.ActionDescriptor.GetCustomAttributes <VersionRouteAttribute>().FirstOrDefault(); if (attr == null) { if (targetApiVersion == "1") { return(true); } return(false); } int targetVersion; if (int.TryParse(targetApiVersion, out targetVersion)) { return(attr.AllowedVersion == targetVersion); } ; return(false); }
public void Apply(Operation operation, SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if (operation.operationId.IndexOf("Trigger", StringComparison.InvariantCultureIgnoreCase) < 0) { return; } var triggerStateParam = operation.parameters.FirstOrDefault(x => x.name.Equals("triggerId")); if (triggerStateParam == null) { return; } if (triggerStateParam.vendorExtensions == null) { triggerStateParam.vendorExtensions = new Dictionary <string, object>(); } triggerStateParam.vendorExtensions.Add("x-ms-summary", "Trigger ID"); triggerStateParam.vendorExtensions.Add("x-ms-visibility", "internal"); triggerStateParam.vendorExtensions.Add("x-ms-scheduler-recommendation", "@workflow().name"); }
/// <summary> /// Remove Swagger Defaults /// </summary> /// <param name="operation">Operation</param> /// <param name="schemaRegistry">Schema</param> /// <param name="apiDescription">Description for the api</param> public void Apply(Swashbuckle.Swagger.Operation operation, Swashbuckle.Swagger.SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { //not Work operation.responses.Clear(); }
public void Apply(Operation operation, DataTypeRegistry dataTypeRegistry, System.Web.Http.Description.ApiDescription apiDescription) { operation.ResponseMessages.Add(new ResponseMessage { Code = 200, Message = "It's all good!" }); }
/// <summary> /// Filter and add Security JWT definition to all accion with has "AuthorizaAttribute" /// </summary> /// <param name="operation">Operation</param> /// <param name="schemaRegistry">Schema</param> /// <param name="apiDescription">Description for the api</param> public void Apply(Swashbuckle.Swagger.Operation operation, Swashbuckle.Swagger.SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { if ( apiDescription.ActionDescriptor.GetFilters().OfType <AuthorizeAttribute>().Any() || apiDescription.ActionDescriptor.ControllerDescriptor.GetFilters().OfType <AuthorizeAttribute>().Any() ) { if (operation.security == null) { operation.security = new List <IDictionary <string, IEnumerable <string> > >(); } var oAuthRequirements = new Dictionary <string, IEnumerable <string> >(); oAuthRequirements.Add(_securityDefinitionNameSchema, new List <string>()); operation.security.Add(oAuthRequirements); } }
public ApiDescription(System.Web.Http.Description.ApiDescription apiDescription) { Description = apiDescription; }
private string GroupAction(System.Web.Http.Description.ApiDescription apiDescriptor) { return(apiDescriptor.ActionDescriptor.ControllerDescriptor.ControllerName); }
public void Apply(Swashbuckle.Swagger.Operation operation, Swashbuckle.Swagger.SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription) { #region Add Documentation Nodes string TModel = null; bool isBlueprintEndpoint = false; Type BlueprintController = apiDescription.ActionDescriptor.ControllerDescriptor.ControllerType.BaseType; if (BlueprintController.IsGenericType) { Type modelType = BlueprintController.GetGenericArguments()[0]; TModel = modelType.Name; //Remove all Auto DB generated Properties CleanModel(schemaRegistry, modelType); isBlueprintEndpoint = true; } //Has Queryable Endpoint Mark?? if (apiDescription.ActionDescriptor.GetCustomAttributes <Swashbuckle.Swagger.Annotations.QueryableEndpoint>().Any()) { var attr = apiDescription.ActionDescriptor.GetCustomAttributes <Swashbuckle.Swagger.Annotations.QueryableEndpoint>().First(); if (attr.QueryableType != null) { var EnumerableType = attr.QueryableType; //Remove all Auto DB generated Properties if (!typeof(System.Collections.IEnumerable).IsAssignableFrom(EnumerableType)) { //Convert to List (Queryable ALWAYS Return a List) EnumerableType = typeof(List <>).MakeGenericType(attr.QueryableType); } CleanModel(schemaRegistry, EnumerableType); operation.responses.Clear(); var statusCode = "200"; operation.responses[statusCode] = new Swashbuckle.Swagger.Response { schema = (EnumerableType != null) ? schemaRegistry.GetOrRegister(EnumerableType) : null }; } isBlueprintEndpoint = true; } if (!isBlueprintEndpoint) { return; } if (apiDescription.HttpMethod == System.Net.Http.HttpMethod.Get) { operation.summary = String.Format(Gale.REST.Resources.SwasbuckleExtension_Blueprint_GET, TModel); operation.description = String.Format(Gale.REST.Resources.SwasbuckleExtension_Blueprint_GET_ImplementationNotes, Gale.REST.Resources.GALE_DOCS_SITE); #region OData Parameter's operation.parameters = new List <Swashbuckle.Swagger.Parameter>(); operation.parameters.Add(new Swashbuckle.Swagger.Parameter() { name = "$select", description = "Fields selector (comma separated)", @in = "query", required = false, type = "string" }); operation.parameters.Add(new Swashbuckle.Swagger.Parameter() { name = "$filter", description = "collection of filter's (comma separated): {field} {operator} {value}", @in = "query", required = false, type = "string" }); operation.parameters.Add(new Swashbuckle.Swagger.Parameter() { name = "$orderBy", description = "Order by clause: {field} (asc|desc)", @in = "query", required = false, type = "string" }); operation.parameters.Add(new Swashbuckle.Swagger.Parameter() { name = "$limit", description = "Limit the number of records returned", @in = "query", required = false, type = "number" }); operation.parameters.Add(new Swashbuckle.Swagger.Parameter() { name = "$offset", description = "Skip records before returning anything", @in = "query", required = false, type = "number" }); #endregion } else if (apiDescription.HttpMethod == System.Net.Http.HttpMethod.Post) { operation.summary = String.Format(Gale.REST.Resources.SwasbuckleExtension_Blueprint_POST, TModel);; operation.description = String.Format(Gale.REST.Resources.SwasbuckleExtension_Blueprint_POST_ImplementationNotes, TModel); } else if (apiDescription.HttpMethod == System.Net.Http.HttpMethod.Put) { operation.summary = String.Format(Gale.REST.Resources.SwasbuckleExtension_Blueprint_PUT, TModel);; } else if (apiDescription.HttpMethod == System.Net.Http.HttpMethod.Delete) { operation.summary = String.Format(Gale.REST.Resources.SwasbuckleExtension_Blueprint_DELETE, TModel);; } #endregion }