Example #1
0
        public async Task InvokeAsync(HttpContext context, IRequestProcessor requestProcessor, IAuthorizationService authorizationService)
        {
            var routeInfo = requestProcessor.GetRoutInfo(context.Request);
            var result    = new ObjectResult(null);

            if (routeInfo.Entity != null)
            {
                if (!IsAuthorized(authorizationService, context.User, routeInfo.Entity, context.Request.Method))
                {
                    context.Response.StatusCode = 401;
                    return;
                }

                var executor = requestProcessor.GetActionExecutor();

                var actionContext = new ActionContext(context, new RouteData(), new ActionDescriptor());
                var controller    = requestProcessor.GetController(actionContext, routeInfo.Entity.DbContextType);

                switch (context.Request.Method)
                {
                case "GET":
                    result = controller.Get(routeInfo);
                    break;

                case "POST":
                    result = controller.Post(routeInfo, await requestProcessor.GetData(context.Request, routeInfo.Entity.EntityType));
                    break;

                case "PUT":
                    result = controller.Put(routeInfo, await requestProcessor.GetData(context.Request, routeInfo.Entity.EntityType));
                    break;

                case "DELETE":
                    result = controller.Delete(routeInfo);
                    break;

                default:
                    throw new NotSupportedException("Http Method not supported");
                }

                await executor.ExecuteAsync(actionContext, result);
            }
            else
            {
                await next(context);
            }
        }