Compare commits

..

2 Commits

Author SHA1 Message Date
tracer 53fc1456d1 refactored to make use of DI
Signed-off-by: tracer <tracer@24unix.net>
2022-01-31 20:49:44 +01:00
tracer b9401769bc added excetion handler around RequestController
Signed-off-by: tracer <tracer@24unix.net>
2022-01-31 20:01:06 +01:00
2 changed files with 75 additions and 32 deletions

View File

@ -1,6 +1,9 @@
<?php declare(strict_types=1);
namespace App\Controller;
use Exception;
error_reporting(error_level: E_ALL);
require dirname(path: __DIR__) . '/vendor/autoload.php';
@ -19,15 +22,14 @@ header(header: "Access-Control-Max-Age: 3600");
header(header: "Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
// TODO make a log class
$oFile = fopen (filename: 'log.txt', mode: 'a');
$oFile = fopen(filename: 'log.txt', mode: 'a');
$uri = parse_url(url: $_SERVER['REQUEST_URI'], component: PHP_URL_PATH);
fputs(stream: $oFile, data: $uri . PHP_EOL);
fclose(stream: $oFile);
$uri = explode( separator: '/', string: $uri );
$uri = explode(separator: '/', string: $uri);
if ($uri[1] !== 'api') {
header(header: "HTTP/1.1 404 Not Found");
exit();
@ -35,6 +37,13 @@ if ($uri[1] !== 'api') {
$requestMethod = $_SERVER["REQUEST_METHOD"];
$controller = new RequestController(config: $config, requestMethod: $requestMethod, uri: $uri);
$controller->processRequest();
try {
$controller = new RequestController(config: $config, requestMethod: $requestMethod, uri: $uri);
$controller->processRequest();
} catch (Exception $e) {
echo json_encode(value: [
'error' => $e->getMessage()
]);
}

View File

@ -1,34 +1,50 @@
<?php declare(strict_types=1);
namespace App\Controller;
error_reporting(error_level: E_ALL);
use App\Repository\ApikeyRepository;
use App\Repository\DomainRepository;
use DI\Container;
use DI\ContainerBuilder;
use UnhandledMatchError;
use function DI\autowire;
/**
*
*/
class RequestController
{
private DatabaseConnection $databaseConnection;
private DomainController $domainController;
private PanelController $panelController;
private String $header;
//private DatabaseConnection $databaseConnection;
private DomainRepository $domainRepository;
private ApikeyRepository $apikeyRepository;
private Container $container;
private string $header;
private array $result;
private String $status;
private String $message;
private string $status;
private string $message;
/**
* @param array $config
* @param String $requestMethod
* @param array $uri
*
* @throws \Exception
*/
public function __construct(private array $config, private String $requestMethod, private array $uri)
public function __construct(private array $config, private string $requestMethod, private array $uri)
{
$this->requestMethod = strtoupper(string: $requestMethod);
$this->databaseConnection = new DatabaseConnection(config: $this->config);
$this->panelController = new PanelController(databaseConnection: $this->databaseConnection);
$this->domainController = new DomainController(databaseConnection: $this->databaseConnection, panelController: $this->panelController);
$containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions([
DatabaseConnection::class => autowire()->constructorParameter(parameter: 'config', value: $this->config),
]);
$this->container = $containerBuilder->build();
$this->domainRepository = $this->container->get(name: DomainRepository::class);
$this->apikeyRepository = $this->container->get(name: ApikeyRepository::class);
}
@ -54,7 +70,7 @@ class RequestController
'PUT' => $this->handleDomainPutRequest(),
'DELETE' => $this->handleDomainDeleteRequest()
};
} catch(UnhandledMatchError) {
} catch (UnhandledMatchError) {
$this->header = '400 Bad Request';
$this->status = '400 Bad Request';
$this->message = "unknown request method: $this->requestMethod";
@ -62,8 +78,8 @@ class RequestController
}
}
}
if(!empty($this->header)) {
if (!empty($this->header)) {
header(header: $_SERVER['SERVER_PROTOCOL'] . ' ' . $this->header);
}
if (!empty($this->result)) {
@ -75,7 +91,7 @@ class RequestController
]);
} else {
echo json_encode(value: [
'status' => $this->status ?? "Error: No status",
'status' => $this->status ?? "Error: No status",
'message' => $this->message ?? "Error: No message."
]);
}
@ -98,9 +114,8 @@ class RequestController
return false;
} else {
[$prefix,] = explode(separator: '.', string: $apiKey);
$apiUsers = new ApiKeys(databaseConnection: $this->databaseConnection);
if ($apiResult = $apiUsers->findByPrefix(prefix: $prefix)) {
$storedHash = $apiResult['api_token'];
if ($apiResult = $this->apikeyRepository->findByPrefix(prefix: $prefix)) {
$storedHash = $apiResult->getApiToken();
if (!password_verify(password: $apiKey, hash: $storedHash)) {
$this->header = "401 Unauthorized";
$this->status = "401 Unauthorized";
@ -110,7 +125,7 @@ class RequestController
} else {
$this->header = "401 Unauthorized";
$this->status = "401 Unauthorized";
$this->message = "API key not found.";
$this->message = "Invalid API key.";
return false;
}
}
@ -123,10 +138,29 @@ class RequestController
public function handleDomainGetRequest(): void
{
if (empty($this->uri[3])) {
$this->result = $this->domainController->findAll();
$domains = $this->domainRepository->findAll();
$resultDomain = [];
foreach ($domains as $singleDomain) {
$domain = [
'id' => $singleDomain->getId(),
'name' => $singleDomain->getName(),
'panel_id' => $singleDomain->getPanelId(),
'a' => $singleDomain->getA(),
'aaaa' => $singleDomain->getAaaa()
];
$resultDomain[] = $domain;
}
$this->result = $resultDomain;
} else {
if ($result = $this->domainController->findByName(name: $this->uri[3])) {
$this->result = $result;
if ($result = $this->domainRepository->findByName(name: $this->uri[3])) {
$domain = [
'id' => $result->getId(),
'name' => $result->getName(),
'panel_id' => $result->getPanelId(),
'a' => $result->getA(),
'aaaa' => $result->getAaaa()
];
$this->result = $domain;
} else {
$this->header = "404 Not Found ";
$this->status = "404 Not Found ";
@ -155,12 +189,12 @@ class RequestController
$this->status = "400 Bad Request";
$this->message = "At least one IP address or panel ID is required.";
} else {
if ($this->domainController->findByName(name: $name)) {
if ($this->domainRepository->findByName(name: $name)) {
$this->header = "400 Bad request";
$this->status = "400 Bad request";
$this->message = "Domain: $name already exists.";
} else {
$result = $this->domainController->insert(name: $name, panelID: $panelID, a: $a, aaaa: $aaaa);
$result = $this->domainRepository->insert(name: $name, panelID: $panelID, a: $a, aaaa: $aaaa);
$this->status = "201 Created";
$this->message = $result;
}
@ -192,7 +226,7 @@ class RequestController
$this->status = "400 Bad Request";
$this->message = "An ID is required";
} else {
if (!$this->domainController->findByID(id: $id)) {
if (!$this->domainRepository->findByID(id: $id)) {
$this->status = "404 Not Found";
$this->message = "Domain with ID : $id doesn't exist.";
} else {
@ -205,7 +239,7 @@ class RequestController
$this->status = "400 Bad Request";
$this->message = "At least one IP address is required.";
} else {
$dcResult = $this->domainController->update(id: $id, name: $panelID, panelID: $name, a: $a, aaaa: $aaaa);
$this->domainRepository->update(id: $id, name: $panelID, panelID: $name, a: $a, aaaa: $aaaa);
$this->header = "201 Updated";
$this->status = "201 Updated";
$this->message = "201 Updated";
@ -236,12 +270,12 @@ class RequestController
$this->status = "400 Bad Request";
$this->message = "You need to supply an ID.";
} else {
if (!$this->domainController->findByID(id: $id)) {
if (!$this->domainRepository->findByID(id: $id)) {
$this->header = "400 Bad Request";
$this->status = "400 Bad Request";
$this->message = "There is no domain with ID $id.";
} else {
$this->domainController->delete(id: $id);
$this->domainRepository->delete(id: $id);
$this->header = "204 No content.";
$this->status = "204 No content.";
$this->message = "The domain $id has been deleted.";