HealthAction.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink\Rest\Action;
  4. use Doctrine\DBAL\Connection;
  5. use Laminas\Diactoros\Response\JsonResponse;
  6. use Psr\Http\Message\ResponseInterface;
  7. use Psr\Http\Message\ServerRequestInterface;
  8. use Psr\Log\LoggerInterface;
  9. use Shlinkio\Shlink\Core\Options\AppOptions;
  10. use Throwable;
  11. class HealthAction extends AbstractRestAction
  12. {
  13. private const HEALTH_CONTENT_TYPE = 'application/health+json';
  14. private const STATUS_PASS = 'pass';
  15. private const STATUS_FAIL = 'fail';
  16. protected const ROUTE_PATH = '/health';
  17. protected const ROUTE_ALLOWED_METHODS = [self::METHOD_GET];
  18. private AppOptions $options;
  19. private Connection $conn;
  20. public function __construct(Connection $conn, AppOptions $options, ?LoggerInterface $logger = null)
  21. {
  22. parent::__construct($logger);
  23. $this->conn = $conn;
  24. $this->options = $options;
  25. }
  26. /**
  27. * Handles a request and produces a response.
  28. *
  29. * May call other collaborating code to generate the response.
  30. */
  31. public function handle(ServerRequestInterface $request): ResponseInterface
  32. {
  33. try {
  34. $connected = $this->conn->ping();
  35. } catch (Throwable $e) {
  36. $connected = false;
  37. }
  38. $statusCode = $connected ? self::STATUS_OK : self::STATUS_SERVICE_UNAVAILABLE;
  39. return new JsonResponse([
  40. 'status' => $connected ? self::STATUS_PASS : self::STATUS_FAIL,
  41. 'version' => $this->options->getVersion(),
  42. 'links' => [
  43. 'about' => 'https://shlink.io',
  44. 'project' => 'https://github.com/shlinkio/shlink',
  45. ],
  46. ], $statusCode, ['Content-type' => self::HEALTH_CONTENT_TYPE]);
  47. }
  48. }