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); }
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; }