Fix for #1442 - Find better names for ApiExplorerProperties
Taking the suggestion here to move these to a sub-object. This is future proof in the event that we need to capture more data for ApiExplorer, and reads better.
This commit is contained in:
parent
46897037e9
commit
305dd87b9b
|
|
@ -13,6 +13,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
ActionMethod = actionMethod;
|
ActionMethod = actionMethod;
|
||||||
|
|
||||||
|
ApiExplorer = new ApiExplorerModel();
|
||||||
Attributes = new List<object>();
|
Attributes = new List<object>();
|
||||||
ActionConstraints = new List<IActionConstraintMetadata>();
|
ActionConstraints = new List<IActionConstraintMetadata>();
|
||||||
Filters = new List<IFilter>();
|
Filters = new List<IFilter>();
|
||||||
|
|
@ -24,8 +25,6 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
ActionMethod = other.ActionMethod;
|
ActionMethod = other.ActionMethod;
|
||||||
ActionName = other.ActionName;
|
ActionName = other.ActionName;
|
||||||
ApiExplorerGroupName = other.ApiExplorerGroupName;
|
|
||||||
ApiExplorerIsVisible = other.ApiExplorerIsVisible;
|
|
||||||
IsActionNameMatchRequired = other.IsActionNameMatchRequired;
|
IsActionNameMatchRequired = other.IsActionNameMatchRequired;
|
||||||
|
|
||||||
// Not making a deep copy of the controller, this action still belongs to the same controller.
|
// Not making a deep copy of the controller, this action still belongs to the same controller.
|
||||||
|
|
@ -38,6 +37,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
HttpMethods = new List<string>(other.HttpMethods);
|
HttpMethods = new List<string>(other.HttpMethods);
|
||||||
|
|
||||||
// Make a deep copy of other 'model' types.
|
// Make a deep copy of other 'model' types.
|
||||||
|
ApiExplorer = new ApiExplorerModel(other.ApiExplorer);
|
||||||
Parameters = new List<ParameterModel>(other.Parameters.Select(p => new ParameterModel(p)));
|
Parameters = new List<ParameterModel>(other.Parameters.Select(p => new ParameterModel(p)));
|
||||||
|
|
||||||
if (other.AttributeRouteModel != null)
|
if (other.AttributeRouteModel != null)
|
||||||
|
|
@ -51,6 +51,15 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
public string ActionName { get; set; }
|
public string ActionName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="ApiExplorerModel"/> for this action.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Setting the value of any properties on <see cref="ActionModel.ApiExplorer"/> will override any
|
||||||
|
/// values set on the associated <see cref="ControllerModel.ApiExplorer"/>.
|
||||||
|
/// </remarks>
|
||||||
|
public ApiExplorerModel ApiExplorer { get; set; }
|
||||||
|
|
||||||
public List<object> Attributes { get; private set; }
|
public List<object> Attributes { get; private set; }
|
||||||
|
|
||||||
public ControllerModel Controller { get; set; }
|
public ControllerModel Controller { get; set; }
|
||||||
|
|
@ -64,18 +73,5 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
public List<ParameterModel> Parameters { get; private set; }
|
public List<ParameterModel> Parameters { get; private set; }
|
||||||
|
|
||||||
public AttributeRouteModel AttributeRouteModel { get; set; }
|
public AttributeRouteModel AttributeRouteModel { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If <c>true</c>, <see cref="Description.ApiDescription"/> objects will be created for this action.
|
|
||||||
/// If <c>null</c> then the value of <see cref="ControllerModel.ApiExplorerIsVisible"/> will be used.
|
|
||||||
/// </summary>
|
|
||||||
public bool? ApiExplorerIsVisible { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The value for <see cref="Description.ApiDescription.GroupName"/> of
|
|
||||||
/// <see cref="Description.ApiDescription"/> objects created for actions defined by this controller.
|
|
||||||
/// If <c>null</c> then the value of <see cref="ControllerModel.ApiExplorerGroupName"/> will be used.
|
|
||||||
/// </summary>
|
|
||||||
public string ApiExplorerGroupName { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A model for ApiExplorer properties associated with a controller or action.
|
||||||
|
/// </summary>
|
||||||
|
public class ApiExplorerModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new <see cref="ApiExplorerModel"/>.
|
||||||
|
/// </summary>
|
||||||
|
public ApiExplorerModel()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new <see cref="ApiExplorerModel"/> with properties copied from <paramref name="other"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="other">The <see cref="ApiExplorerModel"/> to copy.</param>
|
||||||
|
public ApiExplorerModel([NotNull] ApiExplorerModel other)
|
||||||
|
{
|
||||||
|
GroupName = other.GroupName;
|
||||||
|
IsVisible = other.IsVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If <c>true</c>, <see cref="Description.ApiDescription"/> objects will be created for the associated
|
||||||
|
/// controller or action.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Set this value to configure whether or not the associated controller or action will appear in ApiExplorer.
|
||||||
|
/// </remarks>
|
||||||
|
public bool? IsVisible { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The value for <see cref="Description.ApiDescription.GroupName"/> of
|
||||||
|
/// <see cref="Description.ApiDescription"/> objects created for the associated controller or action.
|
||||||
|
/// </summary>
|
||||||
|
public string GroupName { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
ControllerType = controllerType;
|
ControllerType = controllerType;
|
||||||
|
|
||||||
Actions = new List<ActionModel>();
|
Actions = new List<ActionModel>();
|
||||||
|
ApiExplorer = new ApiExplorerModel();
|
||||||
Attributes = new List<object>();
|
Attributes = new List<object>();
|
||||||
AttributeRoutes = new List<AttributeRouteModel>();
|
AttributeRoutes = new List<AttributeRouteModel>();
|
||||||
ActionConstraints = new List<IActionConstraintMetadata>();
|
ActionConstraints = new List<IActionConstraintMetadata>();
|
||||||
|
|
@ -23,8 +24,6 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
public ControllerModel([NotNull] ControllerModel other)
|
public ControllerModel([NotNull] ControllerModel other)
|
||||||
{
|
{
|
||||||
ApiExplorerGroupName = other.ApiExplorerGroupName;
|
|
||||||
ApiExplorerIsVisible = other.ApiExplorerIsVisible;
|
|
||||||
ControllerName = other.ControllerName;
|
ControllerName = other.ControllerName;
|
||||||
ControllerType = other.ControllerType;
|
ControllerType = other.ControllerType;
|
||||||
|
|
||||||
|
|
@ -39,6 +38,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
// Make a deep copy of other 'model' types.
|
// Make a deep copy of other 'model' types.
|
||||||
Actions = new List<ActionModel>(other.Actions.Select(a => new ActionModel(a)));
|
Actions = new List<ActionModel>(other.Actions.Select(a => new ActionModel(a)));
|
||||||
|
ApiExplorer = new ApiExplorerModel(other.ApiExplorer);
|
||||||
AttributeRoutes = new List<AttributeRouteModel>(
|
AttributeRoutes = new List<AttributeRouteModel>(
|
||||||
other.AttributeRoutes.Select(a => new AttributeRouteModel(a)));
|
other.AttributeRoutes.Select(a => new AttributeRouteModel(a)));
|
||||||
}
|
}
|
||||||
|
|
@ -47,8 +47,15 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
public List<ActionModel> Actions { get; private set; }
|
public List<ActionModel> Actions { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="ApiExplorerModel"/> for this controller.
|
||||||
|
/// </summary>
|
||||||
|
public ApiExplorerModel ApiExplorer { get; set; }
|
||||||
|
|
||||||
public ApplicationModel Application { get; set; }
|
public ApplicationModel Application { get; set; }
|
||||||
|
|
||||||
|
public List<AttributeRouteModel> AttributeRoutes { get; private set; }
|
||||||
|
|
||||||
public List<object> Attributes { get; private set; }
|
public List<object> Attributes { get; private set; }
|
||||||
|
|
||||||
public string ControllerName { get; set; }
|
public string ControllerName { get; set; }
|
||||||
|
|
@ -58,19 +65,5 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
public List<IFilter> Filters { get; private set; }
|
public List<IFilter> Filters { get; private set; }
|
||||||
|
|
||||||
public List<RouteConstraintAttribute> RouteConstraints { get; private set; }
|
public List<RouteConstraintAttribute> RouteConstraints { get; private set; }
|
||||||
|
|
||||||
public List<AttributeRouteModel> AttributeRoutes { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If <c>true</c>, <see cref="Description.ApiDescription"/> objects will be created for actions defined by
|
|
||||||
/// this controller.
|
|
||||||
/// </summary>
|
|
||||||
public bool? ApiExplorerIsVisible { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The value for <see cref="Description.ApiDescription.GroupName"/> of
|
|
||||||
/// <see cref="Description.ApiDescription"/> objects created for actions defined by this controller.
|
|
||||||
/// </summary>
|
|
||||||
public string ApiExplorerGroupName { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -194,13 +194,13 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var apiVisibility = attributes.OfType<IApiDescriptionVisibilityProvider>().FirstOrDefault();
|
var apiVisibility = attributes.OfType<IApiDescriptionVisibilityProvider>().FirstOrDefault();
|
||||||
if (apiVisibility != null)
|
if (apiVisibility != null)
|
||||||
{
|
{
|
||||||
actionModel.ApiExplorerIsVisible = !apiVisibility.IgnoreApi;
|
actionModel.ApiExplorer.IsVisible = !apiVisibility.IgnoreApi;
|
||||||
}
|
}
|
||||||
|
|
||||||
var apiGroupName = attributes.OfType<IApiDescriptionGroupNameProvider>().FirstOrDefault();
|
var apiGroupName = attributes.OfType<IApiDescriptionGroupNameProvider>().FirstOrDefault();
|
||||||
if (apiGroupName != null)
|
if (apiGroupName != null)
|
||||||
{
|
{
|
||||||
actionModel.ApiExplorerGroupName = apiGroupName.GroupName;
|
actionModel.ApiExplorer.GroupName = apiGroupName.GroupName;
|
||||||
}
|
}
|
||||||
|
|
||||||
var httpMethods = attributes.OfType<IActionHttpMethodProvider>();
|
var httpMethods = attributes.OfType<IActionHttpMethodProvider>();
|
||||||
|
|
|
||||||
|
|
@ -110,13 +110,13 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var apiVisibility = attributes.OfType<IApiDescriptionVisibilityProvider>().FirstOrDefault();
|
var apiVisibility = attributes.OfType<IApiDescriptionVisibilityProvider>().FirstOrDefault();
|
||||||
if (apiVisibility != null)
|
if (apiVisibility != null)
|
||||||
{
|
{
|
||||||
controllerModel.ApiExplorerIsVisible = !apiVisibility.IgnoreApi;
|
controllerModel.ApiExplorer.IsVisible = !apiVisibility.IgnoreApi;
|
||||||
}
|
}
|
||||||
|
|
||||||
var apiGroupName = attributes.OfType<IApiDescriptionGroupNameProvider>().FirstOrDefault();
|
var apiGroupName = attributes.OfType<IApiDescriptionGroupNameProvider>().FirstOrDefault();
|
||||||
if (apiGroupName != null)
|
if (apiGroupName != null)
|
||||||
{
|
{
|
||||||
controllerModel.ApiExplorerGroupName = apiGroupName.GroupName;
|
controllerModel.ApiExplorer.GroupName = apiGroupName.GroupName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return controllerModel;
|
return controllerModel;
|
||||||
|
|
|
||||||
|
|
@ -297,12 +297,12 @@ namespace Microsoft.AspNet.Mvc
|
||||||
ActionModel action,
|
ActionModel action,
|
||||||
ControllerModel controller)
|
ControllerModel controller)
|
||||||
{
|
{
|
||||||
var apiExplorerIsVisible = action.ApiExplorerIsVisible ?? controller.ApiExplorerIsVisible ?? false;
|
var apiExplorerIsVisible = action.ApiExplorer?.IsVisible ?? controller.ApiExplorer?.IsVisible ?? false;
|
||||||
if (apiExplorerIsVisible)
|
if (apiExplorerIsVisible)
|
||||||
{
|
{
|
||||||
var apiExplorerActionData = new ApiDescriptionActionData()
|
var apiExplorerActionData = new ApiDescriptionActionData()
|
||||||
{
|
{
|
||||||
GroupName = action.ApiExplorerGroupName ?? controller.ApiExplorerGroupName,
|
GroupName = action.ApiExplorer?.GroupName ?? controller.ApiExplorer?.GroupName,
|
||||||
};
|
};
|
||||||
|
|
||||||
actionDescriptor.SetProperty(apiExplorerActionData);
|
actionDescriptor.SetProperty(apiExplorerActionData);
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,16 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var route = new AttributeRouteModel(new HttpGetAttribute("api/Products"));
|
var route = new AttributeRouteModel(new HttpGetAttribute("api/Products"));
|
||||||
action.AttributeRouteModel = route;
|
action.AttributeRouteModel = route;
|
||||||
|
|
||||||
|
var apiExplorer = action.ApiExplorer;
|
||||||
|
apiExplorer.IsVisible = false;
|
||||||
|
apiExplorer.GroupName = "group1";
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var action2 = new ActionModel(action);
|
var action2 = new ActionModel(action);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.NotSame(action, action2.Parameters[0]);
|
Assert.NotSame(action, action2.Parameters[0]);
|
||||||
|
Assert.NotSame(apiExplorer, action2.ApiExplorer);
|
||||||
Assert.NotSame(route, action2.AttributeRouteModel);
|
Assert.NotSame(route, action2.AttributeRouteModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,8 +44,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
action.ActionConstraints.Add(new HttpMethodConstraint(new string[] { "GET" }));
|
action.ActionConstraints.Add(new HttpMethodConstraint(new string[] { "GET" }));
|
||||||
action.ActionName = "Edit";
|
action.ActionName = "Edit";
|
||||||
action.ApiExplorerGroupName = "group";
|
|
||||||
action.ApiExplorerIsVisible = true;
|
|
||||||
action.Attributes.Add(new HttpGetAttribute());
|
action.Attributes.Add(new HttpGetAttribute());
|
||||||
action.Controller = new ControllerModel(typeof(TestController).GetTypeInfo());
|
action.Controller = new ControllerModel(typeof(TestController).GetTypeInfo());
|
||||||
action.Filters.Add(new AuthorizeAttribute());
|
action.Filters.Add(new AuthorizeAttribute());
|
||||||
|
|
@ -53,7 +57,9 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
// Assert
|
// Assert
|
||||||
foreach (var property in typeof(ActionModel).GetProperties())
|
foreach (var property in typeof(ActionModel).GetProperties())
|
||||||
{
|
{
|
||||||
if (property.Name.Equals("Parameters") || property.Name.Equals("AttributeRouteModel"))
|
if (property.Name.Equals("ApiExplorer") ||
|
||||||
|
property.Name.Equals("AttributeRouteModel") ||
|
||||||
|
property.Name.Equals("Parameters"))
|
||||||
{
|
{
|
||||||
// This test excludes other ApplicationModel objects on purpose because we deep copy them.
|
// This test excludes other ApplicationModel objects on purpose because we deep copy them.
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -23,12 +23,17 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var route = new AttributeRouteModel(new HttpGetAttribute("api/Products"));
|
var route = new AttributeRouteModel(new HttpGetAttribute("api/Products"));
|
||||||
controller.AttributeRoutes.Add(route);
|
controller.AttributeRoutes.Add(route);
|
||||||
|
|
||||||
|
var apiExplorer = controller.ApiExplorer;
|
||||||
|
controller.ApiExplorer.GroupName = "group";
|
||||||
|
controller.ApiExplorer.IsVisible = true;
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var controller2 = new ControllerModel(controller);
|
var controller2 = new ControllerModel(controller);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.NotSame(action, controller2.Actions[0]);
|
Assert.NotSame(action, controller2.Actions[0]);
|
||||||
Assert.NotSame(route, controller2.AttributeRoutes[0]);
|
Assert.NotSame(route, controller2.AttributeRoutes[0]);
|
||||||
|
Assert.NotSame(apiExplorer, controller2.ApiExplorer);
|
||||||
|
|
||||||
Assert.NotSame(controller.ActionConstraints, controller2.ActionConstraints);
|
Assert.NotSame(controller.ActionConstraints, controller2.ActionConstraints);
|
||||||
Assert.NotSame(controller.Actions, controller2.Actions);
|
Assert.NotSame(controller.Actions, controller2.Actions);
|
||||||
|
|
@ -44,8 +49,6 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var controller = new ControllerModel(typeof(TestController).GetTypeInfo());
|
var controller = new ControllerModel(typeof(TestController).GetTypeInfo());
|
||||||
|
|
||||||
controller.ActionConstraints.Add(new HttpMethodConstraint(new string[] { "GET" }));
|
controller.ActionConstraints.Add(new HttpMethodConstraint(new string[] { "GET" }));
|
||||||
controller.ApiExplorerGroupName = "group";
|
|
||||||
controller.ApiExplorerIsVisible = true;
|
|
||||||
controller.Application = new ApplicationModel();
|
controller.Application = new ApplicationModel();
|
||||||
controller.Attributes.Add(new HttpGetAttribute());
|
controller.Attributes.Add(new HttpGetAttribute());
|
||||||
controller.ControllerName = "cool";
|
controller.ControllerName = "cool";
|
||||||
|
|
@ -58,7 +61,9 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
// Assert
|
// Assert
|
||||||
foreach (var property in typeof(ControllerModel).GetProperties())
|
foreach (var property in typeof(ControllerModel).GetProperties())
|
||||||
{
|
{
|
||||||
if (property.Name.Equals("Actions") || property.Name.Equals("AttributeRoutes"))
|
if (property.Name.Equals("Actions") ||
|
||||||
|
property.Name.Equals("AttributeRoutes") ||
|
||||||
|
property.Name.Equals("ApiExplorer"))
|
||||||
{
|
{
|
||||||
// This test excludes other ApplicationModel objects on purpose because we deep copy them.
|
// This test excludes other ApplicationModel objects on purpose because we deep copy them.
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ namespace ApiExplorer
|
||||||
{
|
{
|
||||||
if (controller.ControllerType == _type)
|
if (controller.ControllerType == _type)
|
||||||
{
|
{
|
||||||
controller.ApiExplorerIsVisible = false;
|
controller.ApiExplorer.IsVisible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,10 @@ namespace ApiExplorer
|
||||||
{
|
{
|
||||||
foreach (var controller in application.Controllers)
|
foreach (var controller in application.Controllers)
|
||||||
{
|
{
|
||||||
if (controller.ApiExplorerIsVisible == null)
|
if (controller.ApiExplorer.IsVisible == null)
|
||||||
{
|
{
|
||||||
controller.ApiExplorerIsVisible = true;
|
controller.ApiExplorer.IsVisible = true;
|
||||||
controller.ApiExplorerGroupName = controller.ControllerName;
|
controller.ApiExplorer.GroupName = controller.ControllerName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue