diff --git a/composer.json b/composer.json index 3039139..9e93973 100644 --- a/composer.json +++ b/composer.json @@ -1,11 +1,18 @@ { "name": "wikicaptcha/wikicaptcha-backend", "type": "project", "require": { "zendframework/zend-httphandlerrunner": "^1.1", "zendframework/zend-diactoros": "^2.2", "psr/http-server-middleware": "^1.0", "psr/http-message": "^1.0", - "nikic/fast-route": "^1.3" + "nikic/fast-route": "^1.3", + "relay/relay": "^2.0" + }, + "autoload": + { + "psr-4": { + "Wikicaptcha\\Backend\\": "src/" + } } } diff --git a/composer.lock b/composer.lock index 567b697..733a95a 100644 --- a/composer.lock +++ b/composer.lock @@ -1,394 +1,443 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e8781b69ed5c94bd06d3b558f49ef020", + "content-hash": "f93c275a0943b06f8873266531c7a810", "packages": [ { "name": "nikic/fast-route", "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nikic/FastRoute.git", "reference": "181d480e08d9476e61381e04a71b34dc0432e812" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", "reference": "181d480e08d9476e61381e04a71b34dc0432e812", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35|~5.7" }, "type": "library", "autoload": { "psr-4": { "FastRoute\\": "src/" }, "files": [ "src/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov", "email": "nikic@php.net" } ], "description": "Fast request router for PHP", "keywords": [ "router", "routing" ], "time": "2018-02-13T20:26:39+00:00" }, { "name": "psr/http-factory", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", "shasum": "" }, "require": { "php": ">=7.0.0", "psr/http-message": "^1.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", "message", "psr", "psr-17", "psr-7", "request", "response" ], "time": "2019-04-30T12:38:16+00:00" }, { "name": "psr/http-message", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/http-server-handler", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-handler.git", "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", "shasum": "" }, "require": { "php": ">=7.0", "psr/http-message": "^1.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Server\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side request handler", "keywords": [ "handler", "http", "http-interop", "psr", "psr-15", "psr-7", "request", "response", "server" ], "time": "2018-10-30T16:46:14+00:00" }, { "name": "psr/http-server-middleware", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-middleware.git", "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", "shasum": "" }, "require": { "php": ">=7.0", "psr/http-message": "^1.0", "psr/http-server-handler": "^1.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Server\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side middleware", "keywords": [ "http", "http-interop", "middleware", "psr", "psr-15", "psr-7", "request", "response" ], "time": "2018-10-30T17:12:04+00:00" }, + { + "name": "relay/relay", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/relayphp/Relay.Relay.git", + "reference": "6a1c347c54f649ecaa438217e095868587e5ca05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/relayphp/Relay.Relay/zipball/6a1c347c54f649ecaa438217e095868587e5ca05", + "reference": "6a1c347c54f649ecaa438217e095868587e5ca05", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "~1.0", + "psr/http-server-handler": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~7.0", + "psr/http-server-middleware": "~1.0", + "zendframework/zend-diactoros": "~1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Relay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Relay.Relay Contributors", + "homepage": "https://github.com/relayphp/Relay.Relay/contributors" + } + ], + "description": "A PSR-15 server request handler.", + "homepage": "https://github.com/relayphp/Relay.Relay", + "keywords": [ + "middleware", + "psr-15", + "psr-7" + ], + "time": "2019-03-31T01:22:37+00:00" + }, { "name": "zendframework/zend-diactoros", "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/zendframework/zend-diactoros.git", "reference": "de5847b068362a88684a55b0dbb40d85986cfa52" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/de5847b068362a88684a55b0dbb40d85986cfa52", "reference": "de5847b068362a88684a55b0dbb40d85986cfa52", "shasum": "" }, "require": { "php": "^7.1", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, "provide": { "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { "ext-curl": "*", "ext-dom": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^0.5.0", "php-http/psr7-integration-tests": "dev-master", "phpunit/phpunit": "^7.0.2", "zendframework/zend-coding-standard": "~1.0.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.1.x-dev", "dev-develop": "2.2.x-dev", "dev-release-1.8": "1.8.x-dev" } }, "autoload": { "files": [ "src/functions/create_uploaded_file.php", "src/functions/marshal_headers_from_sapi.php", "src/functions/marshal_method_from_sapi.php", "src/functions/marshal_protocol_version_from_sapi.php", "src/functions/marshal_uri_from_sapi.php", "src/functions/normalize_server.php", "src/functions/normalize_uploaded_files.php", "src/functions/parse_cookie_header.php" ], "psr-4": { "Zend\\Diactoros\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "PSR HTTP Message implementations", "keywords": [ "http", "psr", "psr-7" ], "time": "2019-11-13T19:16:13+00:00" }, { "name": "zendframework/zend-httphandlerrunner", "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/zendframework/zend-httphandlerrunner.git", "reference": "75fb12751fe9d6e392cce1ee0d687dacae2db787" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-httphandlerrunner/zipball/75fb12751fe9d6e392cce1ee0d687dacae2db787", "reference": "75fb12751fe9d6e392cce1ee0d687dacae2db787", "shasum": "" }, "require": { "php": "^7.1", "psr/http-message": "^1.0", "psr/http-message-implementation": "^1.0", "psr/http-server-handler": "^1.0" }, "require-dev": { "phpunit/phpunit": "^7.0.2", "zendframework/zend-coding-standard": "~1.0.0", "zendframework/zend-diactoros": "^1.7 || ^2.1.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev", "dev-develop": "1.2.x-dev" }, "zf": { "config-provider": "Zend\\HttpHandlerRunner\\ConfigProvider" } }, "autoload": { "psr-4": { "Zend\\HttpHandlerRunner\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "Execute PSR-15 RequestHandlerInterface instances and emit responses they generate.", "keywords": [ "ZendFramework", "components", "expressive", "psr-15", "psr-7", "zf" ], "time": "2019-02-19T18:20:34+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": [], "platform-dev": [] } diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..eb91c15 --- /dev/null +++ b/public/index.php @@ -0,0 +1,16 @@ +handle($request); + +(new SapiEmitter())->emit($response); \ No newline at end of file diff --git a/src/Controller.php b/src/Controller.php new file mode 100644 index 0000000..ec006dc --- /dev/null +++ b/src/Controller.php @@ -0,0 +1,25 @@ +newInstance($queue); + + return $relay->handle($request); + } +} \ No newline at end of file diff --git a/src/DatabaseConnection.php b/src/DatabaseConnection.php new file mode 100644 index 0000000..31c72ce --- /dev/null +++ b/src/DatabaseConnection.php @@ -0,0 +1,17 @@ +withAttribute('Database', $db); + return $handler->handle($request); + } +} diff --git a/src/DoWork.php b/src/DoWork.php new file mode 100644 index 0000000..d131c44 --- /dev/null +++ b/src/DoWork.php @@ -0,0 +1,17 @@ +getAttribute('Method'); + $method = new $method(); + return $method->handle($request); + } +} diff --git a/src/ErrorHandler.php b/src/ErrorHandler.php new file mode 100644 index 0000000..f1f7047 --- /dev/null +++ b/src/ErrorHandler.php @@ -0,0 +1,26 @@ +handle($request); + } catch(\Throwable $exception) { + $short = "⚠️ Error ⚠️\n\n" . get_class($exception); + $full = $short . ': ' . $exception->getMessage() . ' in ' . + $exception->getFile() . ' on line ' . $exception->getLine() . "\n\nStack trace:\n" . + $exception->getTraceAsString(); + + return new TextResponse($full, 500); + } + } +} diff --git a/src/Router.php b/src/Router.php new file mode 100644 index 0000000..5774c8a --- /dev/null +++ b/src/Router.php @@ -0,0 +1,36 @@ +get('/test', Test::class); + $r->get('/whatever', ''); + }); + + $route = $dispatcher->dispatch($request->getMethod(), $request->getUri()->getPath()); + + + switch($route[0]) { + case \FastRoute\Dispatcher::FOUND: + /** @var MiddlewareInterface $method */ + $method = $route[1]; + $request = $request->withAttribute('Method', $method); + return $handler->handle($request); + default: + case \FastRoute\Dispatcher::NOT_FOUND: + return new JsonResponse(['error' => 'Not found'], 404); + case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED: + return new JsonResponse(['error' => 'Method not allowed'], 405, ['Allow' => implode(', ', $route[1])]); + } + } +} diff --git a/src/Test.php b/src/Test.php new file mode 100644 index 0000000..818f422 --- /dev/null +++ b/src/Test.php @@ -0,0 +1,15 @@ + 'This is a pointless endpoint. But it works!']); + } +}