diff --git a/context.php b/context.php new file mode 100644 index 0000000..dc2fcda --- /dev/null +++ b/context.php @@ -0,0 +1,5 @@ +addRoute(GET, "/", fromController("/GET")); $router->addRoute(GET, "/test", useRenderer(fromController("/test/GET"))); - $router->addRoute(GET, "/ipaddress", useRenderer(fromController("/ipaddress/GET"))); - $router->addRoute(GET, "/whois", useRenderer(fromController("/whois/GET"))); + $router->addRoute(GET, "/ipaddress", + useLog( + useRenderer( + fromController("/ipaddress/GET") + ), + "ipaddress" + ) + ); + $router->addRoute(GET, "/whois", + useLog( + useRenderer( + fromController("/whois/GET") + ), + "whois" + ) + ); - $router->addRoute(GET, "/punycode", useRenderer(fromController("/punycode/GET"))); + $router->addRoute(GET, "/punycode", + useLog( + useRenderer( + fromController("/punycode/GET") + ), + "punycode" + ) + ); }; diff --git a/core.php b/core.php index 490d9ad..0610da8 100644 --- a/core.php +++ b/core.php @@ -10,9 +10,16 @@ if (MAINTENANCE_MODE) { $connection = require_once(ROOT . "/persistence/connection.php"); (require(ROOT . "/persistence/migrate.php"))($connection); + $repositories = (require_once(ROOT . "/persistence/Repositories.php"))($connection); + $router = require(ROOT . "/router/Router.php"); (require(ROOT . "/controllers/routes.php"))($router); - $router->execute([ - "DB_CONNECTION" => $connection, - ]); + + require_once(ROOT . "/context.php"); + $context = [ + DB_CONNECTION => $connection, + REPOSITORIES => $repositories, + ]; + + $router->execute($context); } diff --git a/middleware/log.php b/middleware/log.php new file mode 100644 index 0000000..295e5fd --- /dev/null +++ b/middleware/log.php @@ -0,0 +1,20 @@ +logs()->add($entry); + + return $result; + }; +} \ No newline at end of file diff --git a/middleware/renderer.php b/middleware/renderer.php index 240d7c3..5be1ff1 100644 --- a/middleware/renderer.php +++ b/middleware/renderer.php @@ -7,7 +7,7 @@ function useRenderer($handler, string $default = "JSON", string $query_param = " $rendererMap = require(ROOT . "/renderer/renderer.php"); $renderer = $rendererMap[strtoupper($_GET[$query_param] ?? "")] ?? $rendererMap[$default]; - $context["renderer"] = $renderer; + $context[RENDERER] = $renderer; $result = $handler($context); if ($result !== null) { diff --git a/persistence/Repositories.php b/persistence/Repositories.php new file mode 100644 index 0000000..b4bd5cd --- /dev/null +++ b/persistence/Repositories.php @@ -0,0 +1,19 @@ +map[Logs::class] = new Logs($connection); + } + + public function logs(): Logs { + return $this->map[Logs::class]; + } +} + +return function(PDO $connection): Repositories { + return new Repositories($connection); +}; \ No newline at end of file diff --git a/persistence/migrations/0001_addLoggingTable.sql b/persistence/migrations/0001_addLoggingTable.sql new file mode 100644 index 0000000..91be526 --- /dev/null +++ b/persistence/migrations/0001_addLoggingTable.sql @@ -0,0 +1,13 @@ + +CREATE TABLE `ua_logs` ( + `id` BIGINT AUTO_INCREMENT PRIMARY KEY, + `timestamp` DATETIME DEFAULT CURRENT_TIMESTAMP, + `endpoint` VARCHAR(100), + `client_address` VARCHAR(46), + `access_key` VARCHAR(255), + `clean` BOOLEAN DEFAULT 0, + + INDEX (`endpoint`), + INDEX (`client_address`), + INDEX (`access_key`) +); \ No newline at end of file diff --git a/persistence/models/LogEntry.php b/persistence/models/LogEntry.php new file mode 100644 index 0000000..07a41cf --- /dev/null +++ b/persistence/models/LogEntry.php @@ -0,0 +1,20 @@ +endpoint = $endpoint; + $this->clientAddress = $clientAddress; + $this->accessKey = $accessKey; + } +} \ No newline at end of file diff --git a/persistence/repositories/Logs.php b/persistence/repositories/Logs.php new file mode 100644 index 0000000..8b9f472 --- /dev/null +++ b/persistence/repositories/Logs.php @@ -0,0 +1,26 @@ +connection = $connection; + } + + public function add(LogEntry $entry) { + $statement = $this->connection->prepare(<<table` + (`endpoint`, `client_address`, `access_key`) VALUES + (?, ?, ?) + EOF); + $statement->execute([ + $entry->endpoint, + $entry->clientAddress, + $entry->accessKey, + ]); + } +}