API Base App

This commit is contained in:
2022-11-09 15:20:04 -03:00
parent 1cf5a1f094
commit 0fbf73b3fd
19 changed files with 267 additions and 0 deletions

43
api/setup/app.php Normal file
View File

@ -0,0 +1,43 @@
<?php
require_once 'composer.php';
$builder = new \DI\ContainerBuilder();
$folders = [
'settings',
'setups'
];
foreach ($folders as $f) {
$folder = implode(DIRECTORY_SEPARATOR, [
__DIR__,
$f
]);
if (!file_exists($folder)) {
continue;
}
$files = new FilesystemIterator($folder);
foreach ($files as $file) {
if ($file->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;

6
api/setup/composer.php Normal file
View File

@ -0,0 +1,6 @@
<?php
require_once implode(DIRECTORY_SEPARATOR, [
dirname(__FILE__, 2),
'vendor',
'autoload.php'
]);

View File

@ -0,0 +1,11 @@
<?php
$app->addRoutingMiddleware();
$folder = $app->getContainer()->get('routes_folder');
$files = new FilesystemIterator($folder);
foreach ($files as $file) {
if ($file->isDir()) {
continue;
}
include_once $file->getRealPath();
}

View File

@ -0,0 +1,2 @@
<?php
$app->add($app->getContainer()->get(\ProVM\Common\Middleware\CORS::class));

View File

@ -0,0 +1,2 @@
<?php
$app->add($app->getContainer()->get(\ProVM\Common\Middleware\Auth::class));

View File

@ -0,0 +1,2 @@
<?php
$app->add($app->getContainer()->get(\Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class));

View File

@ -0,0 +1,31 @@
<?php
return [
'emails' => 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;
}
];

View File

@ -0,0 +1,21 @@
<?php
use Psr\Container\ContainerInterface;
return [
'base_folder' => 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'],
];

View File

@ -0,0 +1,4 @@
<?php
return [
'base_command' => 'qpdf'
];

View File

@ -0,0 +1,4 @@
<?php
return [
'log_file' => '/logs/php.log'
];

View File

@ -0,0 +1,27 @@
<?php
use Psr\Container\ContainerInterface;
return [
Ddeboer\Imap\ServerInterface::class => 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);
},
];

View File

@ -0,0 +1,40 @@
<?php
use Psr\Container\ContainerInterface;
return [
\ProVM\Common\Service\Mailboxes::class => 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
);
}
];

View File

@ -0,0 +1,12 @@
<?php
use Psr\Container\ContainerInterface;
return [
\ProVM\Common\Middleware\Auth::class => 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')
);
}
];

View File

@ -0,0 +1,15 @@
<?php
use Psr\Container\ContainerInterface;
return [
\Monolog\Handler\RotatingFileHandler::class => 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;
}
];

View File

@ -0,0 +1,15 @@
<?php
use Psr\Container\ContainerInterface;
return [
\Whoops\Handler\JsonResponseHandler::class => 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)
]);
}
];