From 0fbf73b3fd4ac32840fd5f555ab19e7cddb56137 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Wed, 9 Nov 2022 15:20:04 -0300 Subject: [PATCH] API Base App --- api/public/index.php | 8 +++++ api/resources/routes/01_emails.php | 12 +++++++ api/resources/routes/02_attachments.php | 8 +++++ api/resources/routes/98_install.php | 4 +++ api/setup/app.php | 43 +++++++++++++++++++++++++ api/setup/composer.php | 6 ++++ api/setup/middleware/01_routes.php | 11 +++++++ api/setup/middleware/02_cors.php | 2 ++ api/setup/middleware/97_auth.php | 2 ++ api/setup/middleware/99_errors.php | 2 ++ api/setup/settings/01_env.php | 31 ++++++++++++++++++ api/setup/settings/02_folders.php | 21 ++++++++++++ api/setup/settings/03_decrypt.php | 4 +++ api/setup/settings/98_log.php | 4 +++ api/setup/setups/01_emails.php | 27 ++++++++++++++++ api/setup/setups/02_services.php | 40 +++++++++++++++++++++++ api/setup/setups/97_auth.php | 12 +++++++ api/setup/setups/98_log.php | 15 +++++++++ api/setup/setups/99_errors.php | 15 +++++++++ 19 files changed, 267 insertions(+) create mode 100644 api/public/index.php create mode 100644 api/resources/routes/01_emails.php create mode 100644 api/resources/routes/02_attachments.php create mode 100644 api/resources/routes/98_install.php create mode 100644 api/setup/app.php create mode 100644 api/setup/composer.php create mode 100644 api/setup/middleware/01_routes.php create mode 100644 api/setup/middleware/02_cors.php create mode 100644 api/setup/middleware/97_auth.php create mode 100644 api/setup/middleware/99_errors.php create mode 100644 api/setup/settings/01_env.php create mode 100644 api/setup/settings/02_folders.php create mode 100644 api/setup/settings/03_decrypt.php create mode 100644 api/setup/settings/98_log.php create mode 100644 api/setup/setups/01_emails.php create mode 100644 api/setup/setups/02_services.php create mode 100644 api/setup/setups/97_auth.php create mode 100644 api/setup/setups/98_log.php create mode 100644 api/setup/setups/99_errors.php diff --git a/api/public/index.php b/api/public/index.php new file mode 100644 index 0000000..e8e029a --- /dev/null +++ b/api/public/index.php @@ -0,0 +1,8 @@ +getContainer()->get(\Psr\Log\LoggerInterface::class)->debug(var_export($app, true)); +$app->run(); diff --git a/api/resources/routes/01_emails.php b/api/resources/routes/01_emails.php new file mode 100644 index 0000000..f86121a --- /dev/null +++ b/api/resources/routes/01_emails.php @@ -0,0 +1,12 @@ +group('/emails', function($app) { + $app->get('/mailboxes', [Emails::class, 'mailboxes']); + $app->group('/messages', function($app) { + $app->post('/attachments[/]', [Emails::class, 'withAttachments']); + $app->post('[/]', [Emails::class, 'messages']); + }); + $app->post('/attachments', [Emails::class, 'attachments']); + $app->post('/attachment', [Emails::class, 'attachment']); +}); \ No newline at end of file diff --git a/api/resources/routes/02_attachments.php b/api/resources/routes/02_attachments.php new file mode 100644 index 0000000..5d68696 --- /dev/null +++ b/api/resources/routes/02_attachments.php @@ -0,0 +1,8 @@ +group('/attachments', function($app) { + $app->post('/get', [Attachments::class, 'get']); + $app->post('/decrypt', [Attachments::class, 'decrypt']); + $app->get('[/]', Attachments::class); +}); \ No newline at end of file diff --git a/api/resources/routes/98_install.php b/api/resources/routes/98_install.php new file mode 100644 index 0000000..d446671 --- /dev/null +++ b/api/resources/routes/98_install.php @@ -0,0 +1,4 @@ +get('/install', Install::class); \ No newline at end of file diff --git a/api/setup/app.php b/api/setup/app.php new file mode 100644 index 0000000..7367296 --- /dev/null +++ b/api/setup/app.php @@ -0,0 +1,43 @@ +isDir()) { + continue; + } + $builder->addDefinitions($file->getRealPath()); + } +} +$app = \DI\Bridge\Slim\Bridge::create($builder->build()); + +$folder = implode(DIRECTORY_SEPARATOR, [ + __DIR__, + 'middleware' +]); +if (file_exists($folder)) { + $files = new FilesystemIterator($folder); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + require_once $file->getRealPath(); + } +} + +return $app; diff --git a/api/setup/composer.php b/api/setup/composer.php new file mode 100644 index 0000000..b451f96 --- /dev/null +++ b/api/setup/composer.php @@ -0,0 +1,6 @@ +addRoutingMiddleware(); + +$folder = $app->getContainer()->get('routes_folder'); +$files = new FilesystemIterator($folder); +foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + include_once $file->getRealPath(); +} diff --git a/api/setup/middleware/02_cors.php b/api/setup/middleware/02_cors.php new file mode 100644 index 0000000..063dba6 --- /dev/null +++ b/api/setup/middleware/02_cors.php @@ -0,0 +1,2 @@ +add($app->getContainer()->get(\ProVM\Common\Middleware\CORS::class)); diff --git a/api/setup/middleware/97_auth.php b/api/setup/middleware/97_auth.php new file mode 100644 index 0000000..40efe2f --- /dev/null +++ b/api/setup/middleware/97_auth.php @@ -0,0 +1,2 @@ +add($app->getContainer()->get(\ProVM\Common\Middleware\Auth::class)); diff --git a/api/setup/middleware/99_errors.php b/api/setup/middleware/99_errors.php new file mode 100644 index 0000000..c3f0b5f --- /dev/null +++ b/api/setup/middleware/99_errors.php @@ -0,0 +1,2 @@ +add($app->getContainer()->get(\Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class)); \ No newline at end of file diff --git a/api/setup/settings/01_env.php b/api/setup/settings/01_env.php new file mode 100644 index 0000000..6e61213 --- /dev/null +++ b/api/setup/settings/01_env.php @@ -0,0 +1,31 @@ + function() { + $data = [ + 'host' => $_ENV['EMAIL_HOST'], + 'username' => $_ENV['EMAIL_USERNAME'], + 'password' => $_ENV['EMAIL_PASSWORD'], + 'folder' => $_ENV['EMAIL_FOLDER'], + ]; + if (isset($_ENV['EMAIL_PORT'])) { + $data['port'] = $_ENV['EMAIL_PORT']; + } + return json_decode(json_encode($data)); + }, + 'passwords' => function() { + return explode($_ENV['PASSWORDS_SEPARATOR'] ?? ',', $_ENV['PASSWORDS'] ?? ''); + }, + 'api_key' => $_ENV['API_KEY'], + 'database' => function() { + $arr = [ + 'host' => 'db', + 'name' => $_ENV['MYSQL_DATABASE'], + 'username' => $_ENV['MYSQL_USER'], + 'password' => $_ENV['MYSQL_PASSWORD'] + ]; + if (isset($_ENV['MYSQL_PORT'])) { + $arr['port'] = $_ENV['MYSQL_PORT']; + } + return (object) $arr; + } +]; diff --git a/api/setup/settings/02_folders.php b/api/setup/settings/02_folders.php new file mode 100644 index 0000000..669c193 --- /dev/null +++ b/api/setup/settings/02_folders.php @@ -0,0 +1,21 @@ + function() { + return dirname(__FILE__, 3); + }, + 'resources_folder' => function(ContainerInterface $container) { + return implode(DIRECTORY_SEPARATOR, [ + $container->get('base_folder'), + 'resources' + ]); + }, + 'routes_folder' => function(ContainerInterface $container) { + return implode(DIRECTORY_SEPARATOR, [ + $container->get('resources_folder'), + 'routes' + ]); + }, + 'attachments_folder' => $_ENV['ATTACHMENTS_FOLDER'], +]; \ No newline at end of file diff --git a/api/setup/settings/03_decrypt.php b/api/setup/settings/03_decrypt.php new file mode 100644 index 0000000..8a50554 --- /dev/null +++ b/api/setup/settings/03_decrypt.php @@ -0,0 +1,4 @@ + 'qpdf' +]; diff --git a/api/setup/settings/98_log.php b/api/setup/settings/98_log.php new file mode 100644 index 0000000..55328ea --- /dev/null +++ b/api/setup/settings/98_log.php @@ -0,0 +1,4 @@ + '/logs/php.log' +]; \ No newline at end of file diff --git a/api/setup/setups/01_emails.php b/api/setup/setups/01_emails.php new file mode 100644 index 0000000..23c62b3 --- /dev/null +++ b/api/setup/setups/01_emails.php @@ -0,0 +1,27 @@ + function(ContainerInterface $container) { + $emails = $container->get('emails'); + if (isset($emails->port)) { + return new \Ddeboer\Imap\Server($emails->host, $emails->port); + } + return new \Ddeboer\Imap\Server($emails->host); + }, + \Ddeboer\Imap\ConnectionInterface::class => function(ContainerInterface $container) { + $emails = $container->get('emails'); + $server = $container->get(\Ddeboer\Imap\ServerInterface::class); + return $server->authenticate($emails->username, $emails->password); + }, + PDO::class => function(ContainerInterface $container) { + $database = $container->get('database'); + $dsn = ["mysql:host={$database->host}"]; + if (isset($database->port)) { + $dsn []= "port={$database->port}"; + } + $dsn []= "dbname={$database->name}"; + $dsn = implode(';', $dsn); + return new PDO($dsn, $database->username, $database->password); + }, +]; diff --git a/api/setup/setups/02_services.php b/api/setup/setups/02_services.php new file mode 100644 index 0000000..2116a9e --- /dev/null +++ b/api/setup/setups/02_services.php @@ -0,0 +1,40 @@ + function(ContainerInterface $container) { + return (new \ProVM\Common\Service\Mailboxes( + $container->get(\Ddeboer\Imap\ConnectionInterface::class), + $container->get('emails')->folder, + $container->get('emails')->username + ))->setLogger($container->get(\Psr\Log\LoggerInterface::class)); + }, + \ProVM\Common\Service\Emails::class => function(ContainerInterface $container) { + return (new \ProVM\Common\Service\Emails( + $container->get(\ProVM\Common\Service\Mailboxes::class), + $container->get(\ProVM\Emails\Repository\Message::class), + $container->get('attachments_folder') + ))->setLogger($container->get(\Psr\Log\LoggerInterface::class)); + }, + \ProVM\Common\Service\Attachments::class => function(ContainerInterface $container) { + return new \ProVM\Common\Service\Attachments( + $container->get(\ProVM\Common\Service\Decrypt::class), + $container->get('attachments_folder') + ); + }, + \ProVM\Common\Service\Decrypt::class => function(ContainerInterface $container) { + return new \ProVM\Common\Service\Decrypt( + $container->get(\Psr\Log\LoggerInterface::class), + $container->get('base_command'), + $container->get('passwords') + ); + }, + \ProVM\Common\Service\Install::class => function(ContainerInterface $container) { + $database = $container->get('database'); + $pdo = new PDO("mysql:host={$database->host};dbname={$database->name}", $database->username, $database->password); + return new \ProVM\Common\Service\Install( + $container->get(\Psr\Log\LoggerInterface::class), + $pdo + ); + } +]; diff --git a/api/setup/setups/97_auth.php b/api/setup/setups/97_auth.php new file mode 100644 index 0000000..17e45ac --- /dev/null +++ b/api/setup/setups/97_auth.php @@ -0,0 +1,12 @@ + function(ContainerInterface $container) { + return new \ProVM\Common\Middleware\Auth( + $container->get(\Nyholm\Psr7\Factory\Psr17Factory::class), + $container->get(\Psr\Log\LoggerInterface::class), + $container->get('api_key') + ); + } +]; diff --git a/api/setup/setups/98_log.php b/api/setup/setups/98_log.php new file mode 100644 index 0000000..eaef107 --- /dev/null +++ b/api/setup/setups/98_log.php @@ -0,0 +1,15 @@ + function(ContainerInterface $container) { + $handler = new \Monolog\Handler\RotatingFileHandler($container->get('log_file')); + $handler->setFormatter($container->get(\Monolog\Formatter\LineFormatter::class)); + return $handler; + }, + \Psr\Log\LoggerInterface::class => function(ContainerInterface $container) { + $logger = new \Monolog\Logger('file_logger'); + $logger->pushHandler($container->get(\Monolog\Handler\RotatingFileHandler::class)); + return $logger; + } +]; \ No newline at end of file diff --git a/api/setup/setups/99_errors.php b/api/setup/setups/99_errors.php new file mode 100644 index 0000000..2026f82 --- /dev/null +++ b/api/setup/setups/99_errors.php @@ -0,0 +1,15 @@ + function(ContainerInterface $container) { + return (new \Whoops\Handler\JsonResponseHandler()) + ->setJsonApi(true) + ->addTraceToOutput(true); + }, + \Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class => function(ContainerInterface $container) { + return new \Zeuxisoo\Whoops\Slim\WhoopsMiddleware([], [ + $container->get(\Whoops\Handler\JsonResponseHandler::class) + ]); + } +]; \ No newline at end of file