API Base App
This commit is contained in:
8
api/public/index.php
Normal file
8
api/public/index.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
$app = require_once implode(DIRECTORY_SEPARATOR, [
|
||||||
|
dirname(__FILE__, 2),
|
||||||
|
'setup',
|
||||||
|
'app.php'
|
||||||
|
]);
|
||||||
|
#$app->getContainer()->get(\Psr\Log\LoggerInterface::class)->debug(var_export($app, true));
|
||||||
|
$app->run();
|
12
api/resources/routes/01_emails.php
Normal file
12
api/resources/routes/01_emails.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
use ProVM\Common\Controller\Emails;
|
||||||
|
|
||||||
|
$app->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']);
|
||||||
|
});
|
8
api/resources/routes/02_attachments.php
Normal file
8
api/resources/routes/02_attachments.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
use ProVM\Common\Controller\Attachments;
|
||||||
|
|
||||||
|
$app->group('/attachments', function($app) {
|
||||||
|
$app->post('/get', [Attachments::class, 'get']);
|
||||||
|
$app->post('/decrypt', [Attachments::class, 'decrypt']);
|
||||||
|
$app->get('[/]', Attachments::class);
|
||||||
|
});
|
4
api/resources/routes/98_install.php
Normal file
4
api/resources/routes/98_install.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
use ProVM\Common\Controller\Install;
|
||||||
|
|
||||||
|
$app->get('/install', Install::class);
|
43
api/setup/app.php
Normal file
43
api/setup/app.php
Normal 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
6
api/setup/composer.php
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
require_once implode(DIRECTORY_SEPARATOR, [
|
||||||
|
dirname(__FILE__, 2),
|
||||||
|
'vendor',
|
||||||
|
'autoload.php'
|
||||||
|
]);
|
11
api/setup/middleware/01_routes.php
Normal file
11
api/setup/middleware/01_routes.php
Normal 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();
|
||||||
|
}
|
2
api/setup/middleware/02_cors.php
Normal file
2
api/setup/middleware/02_cors.php
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<?php
|
||||||
|
$app->add($app->getContainer()->get(\ProVM\Common\Middleware\CORS::class));
|
2
api/setup/middleware/97_auth.php
Normal file
2
api/setup/middleware/97_auth.php
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<?php
|
||||||
|
$app->add($app->getContainer()->get(\ProVM\Common\Middleware\Auth::class));
|
2
api/setup/middleware/99_errors.php
Normal file
2
api/setup/middleware/99_errors.php
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<?php
|
||||||
|
$app->add($app->getContainer()->get(\Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class));
|
31
api/setup/settings/01_env.php
Normal file
31
api/setup/settings/01_env.php
Normal 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;
|
||||||
|
}
|
||||||
|
];
|
21
api/setup/settings/02_folders.php
Normal file
21
api/setup/settings/02_folders.php
Normal 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'],
|
||||||
|
];
|
4
api/setup/settings/03_decrypt.php
Normal file
4
api/setup/settings/03_decrypt.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'base_command' => 'qpdf'
|
||||||
|
];
|
4
api/setup/settings/98_log.php
Normal file
4
api/setup/settings/98_log.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'log_file' => '/logs/php.log'
|
||||||
|
];
|
27
api/setup/setups/01_emails.php
Normal file
27
api/setup/setups/01_emails.php
Normal 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);
|
||||||
|
},
|
||||||
|
];
|
40
api/setup/setups/02_services.php
Normal file
40
api/setup/setups/02_services.php
Normal 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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
];
|
12
api/setup/setups/97_auth.php
Normal file
12
api/setup/setups/97_auth.php
Normal 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')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
];
|
15
api/setup/setups/98_log.php
Normal file
15
api/setup/setups/98_log.php
Normal 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;
|
||||||
|
}
|
||||||
|
];
|
15
api/setup/setups/99_errors.php
Normal file
15
api/setup/setups/99_errors.php
Normal 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)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
];
|
Reference in New Issue
Block a user