* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Flarum\Api; use Flarum\Http\Controller\ControllerInterface; use Flarum\Core\User; use Flarum\Http\Session; use Illuminate\Contracts\Container\Container; use Exception; use InvalidArgumentException; use Zend\Diactoros\ServerRequestFactory; class Client { /** * @var Container */ protected $container; /** * @var ErrorHandler */ protected $errorHandler; /** * @param Container $container * @param ErrorHandler $errorHandler */ public function __construct(Container $container, ErrorHandler $errorHandler) { $this->container = $container; $this->errorHandler = $errorHandler; } /** * Execute the given API action class, pass the input and return its response. * * @param string|ControllerInterface $controller * @param Session|User|null $session * @param array $queryParams * @param array $body * @return \Psr\Http\Message\ResponseInterface */ public function send($controller, $session, array $queryParams = [], array $body = []) { $request = ServerRequestFactory::fromGlobals(null, $queryParams, $body); if ($session instanceof Session) { $request = $request->withAttribute('session', $session); $actor = $session->user; } else { $actor = $session; } $request = $request->withAttribute('actor', $actor); if (is_string($controller)) { $controller = $this->container->make($controller); } if (! ($controller instanceof ControllerInterface)) { throw new InvalidArgumentException('Endpoint must be an instance of ' . ControllerInterface::class); } try { return $controller->handle($request); } catch (Exception $e) { return $this->errorHandler->handle($e); } } }