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