2018-04-15 14:51:31 +02:00
|
|
|
<?php
|
|
|
|
|
2023-05-21 14:19:01 +02:00
|
|
|
use Grocy\Controllers\ExceptionController;
|
2020-08-31 20:40:31 +02:00
|
|
|
use Grocy\Helpers\UrlManager;
|
2023-05-21 14:19:01 +02:00
|
|
|
use Grocy\Middleware\LocaleMiddleware;
|
2020-08-31 19:11:51 +02:00
|
|
|
use Grocy\Middleware\CorsMiddleware;
|
2020-02-11 17:42:03 +01:00
|
|
|
use Psr\Container\ContainerInterface as Container;
|
|
|
|
use Slim\Factory\AppFactory;
|
2021-07-05 17:13:01 +02:00
|
|
|
use Slim\Views\Blade;
|
2018-04-15 14:51:31 +02:00
|
|
|
|
2018-07-25 19:28:15 +02:00
|
|
|
// Load composer dependencies
|
2023-06-03 17:36:01 +02:00
|
|
|
require_once __DIR__ . '/packages/autoload.php';
|
2018-07-25 19:28:15 +02:00
|
|
|
|
2018-08-04 07:45:24 +02:00
|
|
|
// Load config files
|
2018-07-24 19:41:35 +02:00
|
|
|
require_once GROCY_DATAPATH . '/config.php';
|
2020-10-19 18:38:12 +02:00
|
|
|
require_once __DIR__ . '/config-dist.php'; // For not in own config defined values we use the default ones
|
2020-12-23 17:37:05 +01:00
|
|
|
require_once __DIR__ . '/helpers/ConfigurationValidator.php';
|
2018-04-15 14:51:31 +02:00
|
|
|
|
2021-07-05 22:40:01 +02:00
|
|
|
// Error reporting definitions
|
|
|
|
if (GROCY_MODE === 'dev')
|
|
|
|
{
|
|
|
|
error_reporting(E_ALL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
error_reporting(E_ALL ^ (E_NOTICE | E_WARNING | E_DEPRECATED));
|
|
|
|
}
|
|
|
|
|
2020-01-05 09:11:11 +01:00
|
|
|
// Definitions for dev/demo/prerelease mode
|
2020-04-17 19:57:22 +02:00
|
|
|
if ((GROCY_MODE === 'dev' || GROCY_MODE === 'demo' || GROCY_MODE === 'prerelease') && !defined('GROCY_USER_ID'))
|
2020-01-05 09:11:11 +01:00
|
|
|
{
|
|
|
|
define('GROCY_USER_ID', 1);
|
|
|
|
}
|
|
|
|
|
2019-07-06 18:29:18 +02:00
|
|
|
// Definitions for disabled authentication mode
|
|
|
|
if (GROCY_DISABLE_AUTH === true)
|
|
|
|
{
|
|
|
|
if (!defined('GROCY_USER_ID'))
|
|
|
|
{
|
|
|
|
define('GROCY_USER_ID', 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-23 17:37:05 +01:00
|
|
|
// Check if any invalid entries in config.php have been made
|
|
|
|
try
|
|
|
|
{
|
|
|
|
(new ConfigurationValidator())->validateConfig();
|
|
|
|
}
|
|
|
|
catch (EInvalidConfig $ex)
|
|
|
|
{
|
|
|
|
exit('Invalid setting in config.php: ' . $ex->getMessage());
|
|
|
|
}
|
|
|
|
|
2021-01-05 10:52:23 +01:00
|
|
|
// Create data/viewcache folder if it doesn't exist
|
2025-01-12 15:24:18 +01:00
|
|
|
$viewcachePath = GROCY_DATAPATH . '/viewcache';
|
|
|
|
if (!file_exists($viewcachePath))
|
2021-01-05 10:52:23 +01:00
|
|
|
{
|
2025-01-12 15:24:18 +01:00
|
|
|
mkdir($viewcachePath);
|
|
|
|
}
|
|
|
|
|
2025-01-17 17:33:04 +01:00
|
|
|
// Empty data/viewcache when and trigger database migrations when:
|
|
|
|
// The version changed (so when an update was done)
|
|
|
|
// GROCY_BASE_URL OR GROCY_BASE_PATH changed
|
|
|
|
$hash = hash('sha256', file_get_contents(__DIR__ . '/version.json') . GROCY_BASE_URL . GROCY_BASE_PATH);
|
|
|
|
$hashCacheFile = $viewcachePath . "/$hash.txt";
|
|
|
|
if (!file_exists($hashCacheFile))
|
2025-01-12 15:24:18 +01:00
|
|
|
{
|
|
|
|
EmptyFolder($viewcachePath);
|
2025-01-17 17:33:04 +01:00
|
|
|
touch($hashCacheFile);
|
2025-01-12 15:24:18 +01:00
|
|
|
|
|
|
|
if (function_exists('opcache_reset'))
|
|
|
|
{
|
|
|
|
opcache_reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Schema migration happens on the root route, so redirect to there
|
|
|
|
header('Location: ' . (new UrlManager(GROCY_BASE_URL))->ConstructUrl('/'));
|
|
|
|
exit();
|
2021-01-05 10:52:23 +01:00
|
|
|
}
|
|
|
|
|
2018-04-15 14:51:31 +02:00
|
|
|
// Setup base application
|
2020-02-11 17:42:03 +01:00
|
|
|
AppFactory::setContainer(new DI\Container());
|
|
|
|
$app = AppFactory::create();
|
|
|
|
|
|
|
|
$container = $app->getContainer();
|
2023-08-02 18:44:30 +02:00
|
|
|
$container->set('view', function (Container $container)
|
|
|
|
{
|
2021-07-05 17:13:01 +02:00
|
|
|
return new Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache');
|
2020-02-11 17:42:03 +01:00
|
|
|
});
|
2021-07-05 17:13:01 +02:00
|
|
|
|
2023-08-02 18:44:30 +02:00
|
|
|
$container->set('UrlManager', function (Container $container)
|
|
|
|
{
|
2020-02-11 17:42:03 +01:00
|
|
|
return new UrlManager(GROCY_BASE_URL);
|
|
|
|
});
|
2021-07-05 17:13:01 +02:00
|
|
|
|
2023-08-02 18:44:30 +02:00
|
|
|
$container->set('ApiKeyHeaderName', function (Container $container)
|
|
|
|
{
|
2020-02-11 17:42:03 +01:00
|
|
|
return 'GROCY-API-KEY';
|
|
|
|
});
|
2018-04-19 20:44:49 +02:00
|
|
|
|
2018-07-25 19:28:15 +02:00
|
|
|
// Load routes from separate file
|
2018-04-15 14:51:31 +02:00
|
|
|
require_once __DIR__ . '/routes.php';
|
|
|
|
|
2020-03-06 20:41:00 +01:00
|
|
|
// Set base path if defined
|
|
|
|
if (!empty(GROCY_BASE_PATH))
|
|
|
|
{
|
|
|
|
$app->setBasePath(GROCY_BASE_PATH);
|
|
|
|
}
|
|
|
|
|
2020-08-31 19:11:51 +02:00
|
|
|
if (GROCY_MODE === 'production' || GROCY_MODE === 'dev')
|
|
|
|
{
|
2023-05-21 14:19:01 +02:00
|
|
|
$app->add(new LocaleMiddleware($container));
|
2020-08-31 19:11:51 +02:00
|
|
|
}
|
2020-08-31 20:40:31 +02:00
|
|
|
else
|
|
|
|
{
|
2020-08-31 19:11:51 +02:00
|
|
|
define('GROCY_LOCALE', GROCY_DEFAULT_LOCALE);
|
|
|
|
}
|
|
|
|
|
|
|
|
$authMiddlewareClass = GROCY_AUTH_CLASS;
|
|
|
|
$app->add(new $authMiddlewareClass($container, $app->getResponseFactory()));
|
2020-02-11 17:42:03 +01:00
|
|
|
// Add default middleware
|
|
|
|
$app->addRoutingMiddleware();
|
2020-08-29 12:05:32 +02:00
|
|
|
$errorMiddleware = $app->addErrorMiddleware(true, false, false);
|
|
|
|
$errorMiddleware->setDefaultErrorHandler(
|
2023-05-21 14:19:01 +02:00
|
|
|
new ExceptionController($app, $container)
|
2020-08-29 12:05:32 +02:00
|
|
|
);
|
2020-02-11 17:42:03 +01:00
|
|
|
|
2020-08-31 19:11:51 +02:00
|
|
|
$app->add(new CorsMiddleware($app->getResponseFactory()));
|
2021-07-12 17:08:59 +02:00
|
|
|
|
2023-05-21 14:13:05 +02:00
|
|
|
$app->getRouteCollector()->setCacheFile(GROCY_DATAPATH . '/viewcache/route_cache.php');
|
|
|
|
|
2021-07-12 17:08:59 +02:00
|
|
|
ob_clean(); // No response output before here
|
2018-04-15 14:51:31 +02:00
|
|
|
$app->run();
|