public async Task <PolicyResult> Authorize(PostAlterCommand action) { // Check if user owns Post if (await postService.IsOwner(action.PostId, action.User.Username)) { return(PolicyResult.Authorized()); } // Is the user an admin? if (await roleService.IsUserAdmin(action.User.Username)) { return(PolicyResult.Authorized()); } // Is the user a moderator? Space?space = await spaceService.FindByPost(action.PostId); if (space == null) { throw new InvalidOperationException(); } if (await roleService.IsUserModerator(action.User.Username, space.Name)) { return(PolicyResult.Authorized()); } return(PolicyResult.Unauthorized()); }