singleton(StorageDriverInterface::class, function () use ($storageBasePath, $userLimitBytes) { return new LocalStorageDriver( basePath: $storageBasePath, defaultLimitBytes: $userLimitBytes ); }); $container->singleton(UserStorageInitializer::class, function () use ($storageBasePath) { return new UserStorageInitializer($storageBasePath); }); $container->singleton(LoggerInterface::class, function () use ($logPath) { $logger = new Logger('cloud'); $logger->pushHandler(new StreamHandler($logPath, Level::Debug)); $logger->pushProcessor(new PsrLogMessageProcessor()); return $logger; }); $container->singleton(PDO::class, function () { return new PDO( 'sqlite:/var/db/database.sqlite', null, null, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); }); $container->singleton(Psr17Factory::class, fn() => new Psr17Factory()); $container->request( ServerRequestInterface::class, fn(Container $c) => new ServerRequestCreator( $c->get(Psr17Factory::class), $c->get(Psr17Factory::class), $c->get(Psr17Factory::class), $c->get(Psr17Factory::class), )->fromGlobals() ); $container->singleton(ClientInterface::class, fn() => new Client()); $container->singleton( ResponseFactoryInterface::class, fn(Container $c) => $c->get(Psr17Factory::class) ); $container->singleton(RequestFactoryInterface::class, fn(Container $c) => $c->get(Psr17Factory::class) ); $container->singleton(StreamFactoryInterface::class, fn(Container $c) => $c->get(Psr17Factory::class) ); //$container->factory(ResponseInterface); $container->singleton(RcloneClient::class, function (Container $c) { return new RcloneClient( http: $c->get(ClientInterface::class), requests: $c->get(RequestFactoryInterface::class), streams: $c->get(StreamFactoryInterface::class), baseUrl: $_ENV['RCLONE_URL'] ?? 'http://rclone:5572', user: $_ENV['RCLONE_USER'], pass: $_ENV['RCLONE_PASS'], ); }); // --------------------------------------------------------------------- // Routes // --------------------------------------------------------------------- $routes = static function (RouteCollector $r): void { $r->get('/', [DashboardController::class, 'index']); $r->get('/license', [LicenseController::class, 'license']); $r->get('/login', [AuthController::class, 'loginForm']); $r->post('/login', [AuthController::class, 'loginSubmit']); $r->post('/logout', [AuthController::class, 'logout']); $r->post('/storage/folders', [StorageController::class, 'createFolder']); $r->post('/storage/files', [StorageController::class, 'uploadFile']); $r->get('/folders/{folder}', [StorageController::class, 'showFolder']); $r->post('/storage/folders/{folder}/delete', [StorageController::class, 'deleteFolder']); $r->addRoute(['POST', 'OPTIONS'], '/storage/tus', [ StorageTusController::class, 'handle', ]); $r->patch('/storage/tus/{id:[a-f0-9]+}', [StorageTusController::class, 'patch']); $r->head('/storage/tus/{id:[a-f0-9]+}', [StorageTusController::class, 'head']); $r->get('/storage/files/download', [StorageController::class, 'downloadFile']); $r->post('/storage/files/delete', [StorageController::class, 'deleteFile']); $r->get('/storage/files/download/multiple', [StorageController::class, 'downloadMultiple']); $r->post('/storage/files/delete/multiple', [StorageController::class, 'deleteMultiple']); $r->get('/icloud/connect', [ICloudAuthController::class, 'connectForm']); $r->post('/icloud/connect', [ICloudAuthController::class, 'submitCredentials']); $r->post('/icloud/2fa', [ICloudAuthController::class, 'submit2fa']); }; // route,middlewares $router = new Router($routes, $container); $router->middlewareFor('/login', ThrottleMiddleware::class); //$router->middlewareFor('/login', AuthMiddleware::class); $app = new App($container); //global,middlewares $app->middleware( CsrfMiddleware::class, AuthMiddleware::class ); $app->router($router); try { $container->beginRequest(); $app->dispatch(); } catch (Throwable $e) { /** @noinspection PhpUnhandledExceptionInspection */ $container->get(LoggerInterface::class)->error($e->getMessage(), ['exception' => $e]); http_response_code(500); header('Content-Type: text/plain; charset=utf-8'); echo 'Internal Server Error'; }