public override void OnActionExecuting(ActionExecutingContext context)
        {
            // get the current action name
            var actionName = ((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor).ActionName;
            // get the visibility settings configured in the startup class, or default them to all
            var actionsVisibility = Features.EntityTypes.ActionVisibility.ContainsKey(typeof(T).FullName) ?
                                    Features.EntityTypes.ActionVisibility[typeof(T).FullName] : GenericControllerActionVisibility.All;

            // by convention the name of the method and the name of the visibility enum match
            // so we try to parse the name of the method in the visibility enum so we can compare afterwards
            GenericControllerActionVisibility currentActionVisibilityCheck = GenericControllerActionVisibility.All;

            Enum.TryParse(actionName, true, out currentActionVisibilityCheck);

            // this practically sais, that if this type is not marked with all or with an enum visibility
            // with the same name as the current method, than we return 404
            if (actionsVisibility != GenericControllerActionVisibility.All &&
                currentActionVisibilityCheck != GenericControllerActionVisibility.All &&
                (currentActionVisibilityCheck & actionsVisibility) == 0)
            {
                context.Result = new StatusCodeResult(404);
                return;
            }
            base.OnActionExecuting(context);
        }
Ejemplo n.º 2
0
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var actionName    = context.MethodInfo.Name;
            var reflectedType = context.MethodInfo.ReflectedType;
            var declaringType = context.MethodInfo.DeclaringType;

            if (declaringType.Name.StartsWith("GenericController"))
            {
                // by convention the name of the method and the name of the visibility enum match
                // so we try to parse the name of the method in the visibility enum so we can compare afterwards
                GenericControllerActionVisibility currentActionVisibilityCheck = GenericControllerActionVisibility.All;
                Enum.TryParse(actionName, true, out currentActionVisibilityCheck);
                var types = declaringType.GetGenericArguments();
                if (types.Length == 1)
                {
                    var actionsVisibility = Features.EntityTypes.ActionVisibility.ContainsKey(types[0].FullName) ?
                                            Features.EntityTypes.ActionVisibility[types[0].FullName] : GenericControllerActionVisibility.All;
                    if (actionsVisibility != GenericControllerActionVisibility.All &&
                        currentActionVisibilityCheck != GenericControllerActionVisibility.All &&
                        (currentActionVisibilityCheck & actionsVisibility) == 0)
                    {
                        operation.Tags.Add(new OpenApiTag()
                        {
                            Name = "REMOVE"
                        });
                    }
                }
            }
        }
 private void AddRestModel <T>(IServiceCollection services, GenericControllerActionVisibility actionVisibility = GenericControllerActionVisibility.All) where T : Data.Models.Metadata
 {
     services.AddTransient <IRepository <T>, Repository <T> >();
     Features.EntityTypes.Types.Add(typeof(T).GetTypeInfo());
     Features.EntityTypes.ActionVisibility[typeof(T).FullName] = actionVisibility;
 }