Created HealthAction

This commit is contained in:
Alejandro Celaya 2018-12-23 10:18:38 +01:00
parent 29d49dfbf4
commit 3f65ef998c
9 changed files with 90 additions and 4 deletions

View file

@ -1,4 +1,6 @@
<?php
declare(strict_types=1);
use Zend\Expressive\Container\WhoopsErrorResponseGeneratorFactory;
return [

View file

@ -10,6 +10,7 @@ return [
'auth' => [
'routes_whitelist' => [
Action\AuthenticateAction::class,
Action\HealthAction::class,
Action\ShortUrl\SingleStepCreateShortUrlAction::class,
],

View file

@ -18,6 +18,7 @@ return [
ApiKeyService::class => ConfigAbstractFactory::class,
Action\AuthenticateAction::class => ConfigAbstractFactory::class,
Action\HealthAction::class => Action\HealthActionFactory::class,
Action\ShortUrl\CreateShortUrlAction::class => ConfigAbstractFactory::class,
Action\ShortUrl\SingleStepCreateShortUrlAction::class => ConfigAbstractFactory::class,
Action\ShortUrl\EditShortUrlAction::class => ConfigAbstractFactory::class,

View file

@ -3,12 +3,11 @@ declare(strict_types=1);
namespace Shlinkio\Shlink\Rest;
use Shlinkio\Shlink\Rest\Action;
return [
'routes' => [
Action\AuthenticateAction::getRouteDef(),
Action\HealthAction::getRouteDef(),
// Short codes
Action\ShortUrl\CreateShortUrlAction::getRouteDef([

View file

@ -14,6 +14,7 @@ abstract class AbstractRestAction implements RequestHandlerInterface, RequestMet
{
protected const ROUTE_PATH = '';
protected const ROUTE_ALLOWED_METHODS = [];
protected const ROUTE_CAN_BE_VERSIONED = true;
/** @var LoggerInterface */
protected $logger;
@ -30,6 +31,7 @@ abstract class AbstractRestAction implements RequestHandlerInterface, RequestMet
'middleware' => array_merge($prevMiddleware, [static::class], $postMiddleware),
'path' => static::ROUTE_PATH,
'allowed_methods' => static::ROUTE_ALLOWED_METHODS,
'can_be_versioned' => static::ROUTE_CAN_BE_VERSIONED,
];
}
}

View file

@ -12,6 +12,7 @@ use Shlinkio\Shlink\Rest\Service\ApiKeyServiceInterface;
use Shlinkio\Shlink\Rest\Util\RestUtils;
use Zend\Diactoros\Response\JsonResponse;
/** @deprecated */
class AuthenticateAction extends AbstractRestAction
{
protected const ROUTE_PATH = '/authenticate';

View file

@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace Shlinkio\Shlink\Rest\Action;
use Doctrine\DBAL\Connection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Log\LoggerInterface;
use Shlinkio\Shlink\Core\Options\AppOptions;
use Zend\Diactoros\Response\JsonResponse;
class HealthAction extends AbstractRestAction
{
private const HEALTH_CONTENT_TYPE = 'application/health+json';
protected const ROUTE_PATH = '/health';
protected const ROUTE_ALLOWED_METHODS = [self::METHOD_GET];
protected const ROUTE_CAN_BE_VERSIONED = false;
/** @var AppOptions */
private $options;
/** @var Connection */
private $conn;
public function __construct(Connection $conn, AppOptions $options, LoggerInterface $logger = null)
{
parent::__construct($logger);
$this->conn = $conn;
$this->options = $options;
}
/**
* Handles a request and produces a response.
*
* May call other collaborating code to generate the response.
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
$connected = $this->conn->ping();
$statusCode = $connected ? self::STATUS_OK : self::STATUS_SERVICE_UNAVAILABLE;
return new JsonResponse([
'status' => $connected ? 'pass' : 'fail',
'version' => $this->options->getVersion(),
'links' => [
'about' => 'https://shlink.io',
'project' => 'https://github.com/shlinkio/shlink',
],
], $statusCode, ['Content-type' => self::HEALTH_CONTENT_TYPE]);
}
}

View file

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace Shlinkio\Shlink\Rest\Action;
use Doctrine\ORM\EntityManager;
use Psr\Container\ContainerInterface;
use Shlinkio\Shlink\Core\Options\AppOptions;
class HealthActionFactory
{
public function __invoke(ContainerInterface $container)
{
$em = $container->get(EntityManager::class);
$options = $container->get(AppOptions::class);
$logger = $container->get('Logger_Shlink');
return new HealthAction($em->getConnection(), $options, $logger);
}
}

View file

@ -5,10 +5,12 @@ namespace Shlinkio\Shlink\Rest;
use Zend\Config\Factory;
use Zend\Stdlib\Glob;
use function sprintf;
class ConfigProvider
{
const ROUTES_PREFIX = '/rest/v{version:1}';
private const ROUTES_PREFIX = '/rest';
private const ROUTES_VERSION_PARAM = '/v{version:1}';
public function __invoke()
{
@ -23,7 +25,14 @@ class ConfigProvider
// Prepend the routes prefix to every path
foreach ($routes as $key => $route) {
$routes[$key]['path'] = self::ROUTES_PREFIX . $route['path'];
['can_be_versioned' => $routeCanBeVersioned, 'path' => $path] = $route;
$routes[$key]['path'] = sprintf(
'%s%s%s',
self::ROUTES_PREFIX,
$routeCanBeVersioned ? self::ROUTES_VERSION_PARAM : '',
$path
);
unset($routes[$key]['can_be_versioned']);
}
return $config;