Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
81.25% covered (warning)
81.25%
13 / 16
CRAP
65.08% covered (warning)
65.08%
41 / 63
Stack
0.00% covered (danger)
0.00%
0 / 1
81.25% covered (warning)
81.25%
13 / 16
71.92
65.08% covered (warning)
65.08%
41 / 63
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 getActions
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setActions
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 addAction
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getActionName
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setActionName
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getRequest
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setRequest
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getResponse
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setResponse
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 register
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 handleRequest
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 14
 requestManager
0.00% covered (danger)
0.00%
0 / 1
8.19
85.71% covered (warning)
85.71%
18 / 21
 send
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 5
 setContainer
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 get
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
<?php
declare(strict_types=1);
namespace Korobochkin\WPKit\AlmostControllers;
use Korobochkin\WPKit\AlmostControllers\Exceptions\ActionNotFoundException;
use Korobochkin\WPKit\AlmostControllers\Exceptions\UnauthorizedException;
use Korobochkin\WPKit\Utils\RequestFactory;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\ConstraintViolationList;
/**
 * Class Stack
 */
class Stack implements StackInterface
{
    /**
     * @var ActionInterface[]
     */
    protected $actions;
    /**
     * @var string WordPress action name.
     */
    protected $actionName;
    /**
     * @var ActionInterface Current action.
     */
    protected $currentAction;
    /**
     * @var \Symfony\Component\HttpFoundation\Request
     */
    protected $request;
    /**
     * @var \Symfony\Component\HttpFoundation\Response
     */
    protected $response;
    /**
     * @var ContainerInterface DI Container.
     */
    protected $container;
    /**
     * Stack constructor.
     *
     * @param ActionInterface[] $actions
     * @param string $actionName
     */
    public function __construct(array $actions, $actionName)
    {
        $this->actions    = $actions;
        $this->actionName = $actionName;
    }
    /**
     * @inheritdoc
     */
    public function getActions()
    {
        return $this->actions;
    }
    /**
     * @inheritdoc
     */
    public function setActions(array $actions)
    {
        $this->actions = $actions;
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function addAction(ActionInterface $action)
    {
        $this->actions[$action->getName()] = $action;
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function getActionName()
    {
        return $this->actionName;
    }
    /**
     * @inheritdoc
     */
    public function setActionName($actionName)
    {
        $this->actionName = $actionName;
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function getRequest()
    {
        return $this->request;
    }
    /**
     * @inheritdoc
     */
    public function setRequest(Request $request)
    {
        $this->request = $request;
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function getResponse()
    {
        return $this->response;
    }
    /**
     * @inheritdoc
     */
    public function setResponse(Response $response)
    {
        $this->response = $response;
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function register()
    {
        if (empty($this->actions)) {
            throw new \LogicException('You need set actions before call register method.');
        }
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function handleRequest()
    {
        try {
            // Remove escaping slashes in RequestFactory (added by WordPress by wp_magic_quotes()).
            $this->setRequest(RequestFactory::create());
            // Process request
            $this->requestManager();
        } catch (ActionNotFoundException $exception) {
            $this->response->setStatusCode(Response::HTTP_NOT_FOUND);
        } catch (UnauthorizedException $exception) {
            $this->response->setStatusCode(Response::HTTP_FORBIDDEN);
        } catch (\Exception $exception) {
            if ($this->response->getStatusCode() < 300) {
                // Status code for unknown exceptions.
                $this->response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
            }
        } finally {
            $this->currentAction = null;
        }
        if ($this->response) {
            // Send response.
            $this->send();
        }
    }
    /**
     * @inheritdoc
     */
    public function requestManager()
    {
        // Find the requested action.
        $action = $this->request->request->get('actionName');
        if (is_null($action)) {
            $action = $this->request->query->get('actionName');
        }
        if (!is_null($action) && isset($this->actions[$action])) {
            // Initialize the action.
            if (is_string($this->actions[$action])) {
                $this->actions[$action] = new $this->actions[$action]();
            }
            $this->currentAction = $this->actions[$action];
            if (is_user_logged_in()) {
                // For signed in users.
                if (!$this->currentAction->isEnabledForLoggedIn()) {
                    throw new UnauthorizedException();
                }
            } else {
                // For not signed in users
                if (!$this->currentAction->isEnabledForNotLoggedIn()) {
                    throw new UnauthorizedException();
                }
            }
            // Action should not overwrite response object.
            $this->currentAction
                ->setContainer($this->container);
            $this->currentAction
                ->setViolationsList(new ConstraintViolationList())
                ->setRequest($this->request)
                ->setResponse($this->response)
                ->handleRequest();
            return $this;
        } else {
            // Not supported action or action name invalid (null).
            throw new ActionNotFoundException();
        }
    }
    /**
     * @inheritdoc
     */
    public function send()
    {
        $this->response->send();
        // This code part of wp_send_json() function.
        if (defined('DOING_AJAX') && DOING_AJAX) {
            wp_die();
        } else {
            die;
        }
    }
    /**
     * @inheritdoc
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
        return $this;
    }
    /**
     * @inheritdoc
     */
    public function get($id)
    {
        return $this->container->get($id);
    }
}