refactored to make use of DI

Signed-off-by: tracer <tracer@24unix.net>
This commit is contained in:
tracer 2022-01-31 20:49:44 +01:00
parent b9401769bc
commit 53fc1456d1
1 changed files with 61 additions and 27 deletions

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.";