. * * @category Core * @package Galette * * @author Johan Cwiklinski * @copyright 2015-2023 The Galette Team * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version * @link http://galette.tuxfamily.org * @since Available since 0.9dev - 2015-10-31 */ namespace Galette\Middleware; use Galette\Core\I18n; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Server\RequestHandlerInterface as RequestHandler; use Slim\Routing\RouteParser; /** * Galette's Slim middleware for Update and Maintenance * * Renders maintenance and needs update pages, as 503 (service not available) * * @category Middleware * @name UpdateAndMaintenance * @package Galette * @author Johan Cwiklinski * @copyright 2015-2023 The Galette Team * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version * @link http://galette.tuxfamily.org * @since Available since 0.9dev - 2015-10-31 */ class UpdateAndMaintenance { public const MAINTENANCE = 0; public const NEED_UPDATE = 1; /** * @var callable */ protected $callback; /** * @var I18n */ protected $i18n; /** * @var RouteParser */ protected RouteParser $routeParser; /** * Constructor * * @param I18n $i18n I18n instance * @param RouteParser $routeParser Route parser * @param callable|int $callback Callable or local constant */ public function __construct(I18n $i18n, RouteParser $routeParser, callable|int $callback = self::MAINTENANCE) { $this->i18n = $i18n; $this->routeParser = $routeParser; if ($callback === self::MAINTENANCE) { $this->callback = array($this, 'maintenancePage'); } elseif ($callback === self::NEED_UPDATE) { $this->callback = array($this, 'needsUpdatePage'); } else { if (!is_callable($callback)) { throw new \InvalidArgumentException('argument callback must be callable'); } else { $this->callback = $callback; } } } /** * Middleware invokable class * * @param Request $request PSR7 request * @param RequestHandler $handler PSR7 request handler * * @return Response */ public function __invoke(Request $request, RequestHandler $handler): Response { $response = new \Slim\Psr7\Response(); $response ->withStatus(503) ->withHeader('Content-type', 'text/html') ->getBody()->write(call_user_func($this->callback, $request)); return $response; } /** * Renders the page * * @param Request $request PSR7 request * @param string $contents HTML page contents * * @return string */ private function renderPage(Request $request, $contents) { $path = $this->routeParser->urlFor('slash'); //add ending / if missing if ( $path === '' || $path !== '/' && substr($path, -1) !== '/' ) { $path .= '/'; } $theme_path = $path . GALETTE_THEME; $body = " i18n->getAbbrev() . "\"> " . _T("Galette needs update!") . "
\"[
" . $contents . "
"; return $body; } /** * Displays maintenance page * * @param Request $request PSR7 request * * @return string */ private function maintenancePage(Request $request) { $contents = "
" . _T("Galette is currently under maintenance!") . "

" . _T("The Galette instance you are requesting is currently under maintenance. Please come back later.") . "

"; return $this->renderPage($request, $contents); } /** * Displays needs update page * * @param Request $request PSR7 request * * @return string */ private function needsUpdatePage(Request $request) { $contents = "

" . _T("Galette needs update!") . "

" . _T("Your Galette database is not present, or not up to date.") . "

" . _T("Please run install or upgrade procedure (check the documentation)") . "

"; return $this->renderPage($request, $contents); } }