From 0a9f77f82f4a98dfa15bb91ded6a7af4c18b6a72 Mon Sep 17 00:00:00 2001 From: Cerys Lewis Date: Mon, 22 Jul 2024 16:27:20 +0100 Subject: [PATCH] just a bit of tidying, nowt exciting --- src/Attributes/QueryBuilderQuery.php | 6 ++++- src/Attributes/QueryBuilderRequiredField.php | 6 ++++- src/Core/DeegraphServer.php | 8 +++--- src/DataStructures/QueryResponseRow.php | 15 ++++------- src/Enumerators/DeegraphEqualityOperator.php | 2 +- .../DeegraphNumericalComparator.php | 2 +- src/Enumerators/HTTPMethod.php | 14 +++++++++++ src/Interfaces/QueryInstanceInterface.php | 10 ++++++-- .../QueryBuilders/PutQueryBuilder.php | 1 + src/QueryInstance/DeleteQuery.php | 3 ++- src/QueryInstance/GrantQuery.php | 3 ++- src/QueryInstance/InsertQuery.php | 5 ++-- src/QueryInstance/PutQuery.php | 9 ++++--- src/QueryInstance/SelectQuery.php | 5 ++-- src/QueryResponse/SelectQueryResponse.php | 3 ++- src/Superclasses/QueryInstanceSuperclass.php | 5 ++++ src/Traits/QueryBuilderTrait.php | 25 ++++++++++++++++++- tests/QueryBuilderPutTest.php | 13 +++++----- 18 files changed, 97 insertions(+), 38 deletions(-) create mode 100644 src/Enumerators/HTTPMethod.php diff --git a/src/Attributes/QueryBuilderQuery.php b/src/Attributes/QueryBuilderQuery.php index 4e69818..5fe0f1b 100644 --- a/src/Attributes/QueryBuilderQuery.php +++ b/src/Attributes/QueryBuilderQuery.php @@ -14,6 +14,10 @@ use ReflectionClass; { public function __construct() { - parent::__construct(new Name("QueryBuilderQuery", []), [], []); + parent::__construct( + name: new Name("QueryBuilderQuery", []), + args: [], + attributes: [], + ); } } diff --git a/src/Attributes/QueryBuilderRequiredField.php b/src/Attributes/QueryBuilderRequiredField.php index 7b41320..90f6cbb 100644 --- a/src/Attributes/QueryBuilderRequiredField.php +++ b/src/Attributes/QueryBuilderRequiredField.php @@ -14,6 +14,10 @@ use PhpParser\Node\Name; ) { $this->Required = $required; - parent::__construct(new Name("QueryBuilderRequiredField", []), [], []); + parent::__construct( + name: new Name("QueryBuilderRequiredField", []), + args: [], + attributes: [], + ); } } diff --git a/src/Core/DeegraphServer.php b/src/Core/DeegraphServer.php index c5e5ca9..5b063b2 100644 --- a/src/Core/DeegraphServer.php +++ b/src/Core/DeegraphServer.php @@ -3,6 +3,7 @@ namespace Darksparrow\DeegraphInteractions\Core; use Darksparrow\DeegraphInteractions\DataStructures\ServerInfo; +use Darksparrow\DeegraphInteractions\Enumerators\HTTPMethod; use Exception; final class DeegraphServer @@ -38,6 +39,7 @@ final class DeegraphServer * Runs an API request against the Deegraph Server, and returns back information about the Deegraph Server. * * @return ServerInfo + * @throws Exception */ public function ServerInfo(): ServerInfo { @@ -45,7 +47,7 @@ final class DeegraphServer return ServerInfo::FromAPIResponse(response: $response); } - public function RunRawRequest(string $endpoint, string $method = "GET", string $body = null): string + public function RunRawRequest(string $endpoint, HTTPMethod $method = HTTPMethod::GET, string $body = null): string { $ch = curl_init("https://{$this->ServerDomain}:{$this->Port}{$endpoint}"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ @@ -55,7 +57,7 @@ final class DeegraphServer ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - if($method == "POST") + if($method == HTTPMethod::POST) { curl_setopt($ch, CURLOPT_POST, 1); } @@ -65,7 +67,7 @@ final class DeegraphServer curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); } - if($method == "POST" || $method == "PUT") + if($method == HTTPMethod::POST || $method == HTTPMethod::PUT) { if($body != null) { diff --git a/src/DataStructures/QueryResponseRow.php b/src/DataStructures/QueryResponseRow.php index af6b040..7ed2d9b 100644 --- a/src/DataStructures/QueryResponseRow.php +++ b/src/DataStructures/QueryResponseRow.php @@ -7,22 +7,17 @@ class QueryResponseRow public string $Search; public array $Results; - public static function FromArray(array $array): QueryResponseRow + public function __construct(array $array) { - $builder = new QueryResponseRow(); - - $builder->Search = key(array: $array); - foreach($array["{$builder->Search}"] as $key => $value) + $this->Search = key(array: $array); + foreach($array["{$this->Search}"] as $key => $value) { - $builder->Results[] = new KeyValuePair(key: $key, value: $value); + $this->Results[] = new KeyValuePair(key: $key, value: $value); } - - return $builder; } public function __toString(): string { return json_encode($this, JSON_PRETTY_PRINT); } - -} \ No newline at end of file +} diff --git a/src/Enumerators/DeegraphEqualityOperator.php b/src/Enumerators/DeegraphEqualityOperator.php index d4e0671..5ffd010 100644 --- a/src/Enumerators/DeegraphEqualityOperator.php +++ b/src/Enumerators/DeegraphEqualityOperator.php @@ -9,5 +9,5 @@ enum DeegraphEqualityOperator: string case IS = "==="; case DIFFERENT = "!="; - case ISNT = "ISNT"; + case IS_NOT = "ISNT"; } diff --git a/src/Enumerators/DeegraphNumericalComparator.php b/src/Enumerators/DeegraphNumericalComparator.php index 2ae6739..c16f0b7 100644 --- a/src/Enumerators/DeegraphNumericalComparator.php +++ b/src/Enumerators/DeegraphNumericalComparator.php @@ -1,6 +1,6 @@ PutInto); + self::ValidateDeegraphPath($relativePath); $this->PutAt = self::ValidateDeegraphPath( target: $relativePath, ); diff --git a/src/QueryInstance/DeleteQuery.php b/src/QueryInstance/DeleteQuery.php index e2ebfbb..601865d 100644 --- a/src/QueryInstance/DeleteQuery.php +++ b/src/QueryInstance/DeleteQuery.php @@ -3,6 +3,7 @@ namespace Darksparrow\DeegraphInteractions\QueryInstance; use Darksparrow\DeegraphInteractions\Core\DeegraphServer; +use Darksparrow\DeegraphInteractions\Enumerators\HTTPMethod; use Darksparrow\DeegraphInteractions\Interfaces\QueryInstanceInterface; use Darksparrow\DeegraphInteractions\QueryResponse\DeleteQueryResponse; use Darksparrow\DeegraphInteractions\QueryResponse\GrantQueryResponse; @@ -14,7 +15,7 @@ final class DeleteQuery extends QueryInstanceSuperclass implements QueryInstance { $response = $deegraphServer->RunRawRequest( endpoint: "/api/v1/@delete", - method: "DELETE", + method: HTTPMethod::DELETE, body: $this->QueryString, ); return new DeleteQueryResponse(response: $response); diff --git a/src/QueryInstance/GrantQuery.php b/src/QueryInstance/GrantQuery.php index 618c546..36d54f7 100644 --- a/src/QueryInstance/GrantQuery.php +++ b/src/QueryInstance/GrantQuery.php @@ -3,6 +3,7 @@ namespace Darksparrow\DeegraphInteractions\QueryInstance; use Darksparrow\DeegraphInteractions\Core\DeegraphServer; +use Darksparrow\DeegraphInteractions\Enumerators\HTTPMethod; use Darksparrow\DeegraphInteractions\Interfaces\QueryInstanceInterface; use Darksparrow\DeegraphInteractions\QueryResponse\GrantQueryResponse; use Darksparrow\DeegraphInteractions\Superclasses\QueryInstanceSuperclass; @@ -13,7 +14,7 @@ final class GrantQuery extends QueryInstanceSuperclass implements QueryInstanceI { $response = $deegraphServer->RunRawRequest( endpoint: "/api/v1/@query", - method: "POST", + method: HTTPMethod::POST, body: $this->QueryString, ); return new GrantQueryResponse(response: $response); diff --git a/src/QueryInstance/InsertQuery.php b/src/QueryInstance/InsertQuery.php index bfa3bd9..584d7ab 100644 --- a/src/QueryInstance/InsertQuery.php +++ b/src/QueryInstance/InsertQuery.php @@ -3,17 +3,18 @@ namespace Darksparrow\DeegraphInteractions\QueryInstance; use Darksparrow\DeegraphInteractions\Core\DeegraphServer; +use Darksparrow\DeegraphInteractions\Enumerators\HTTPMethod; use Darksparrow\DeegraphInteractions\Interfaces\QueryInstanceInterface; use Darksparrow\DeegraphInteractions\QueryResponse\InsertQueryResponse; use Darksparrow\DeegraphInteractions\Superclasses\QueryInstanceSuperclass; final class InsertQuery extends QueryInstanceSuperclass implements QueryInstanceInterface { - public function RunQuery(DeegraphServer $deegraphServer) + public function RunQuery(DeegraphServer $deegraphServer): InsertQueryResponse { $response = $deegraphServer->RunRawRequest( endpoint: "/api/v1/@query", - method: "POST", + method: HTTPMethod::POST, body: $this->QueryString, ); return new InsertQueryResponse(response: $response); diff --git a/src/QueryInstance/PutQuery.php b/src/QueryInstance/PutQuery.php index 2609297..755d237 100644 --- a/src/QueryInstance/PutQuery.php +++ b/src/QueryInstance/PutQuery.php @@ -3,17 +3,18 @@ namespace Darksparrow\DeegraphInteractions\QueryInstance; use Darksparrow\DeegraphInteractions\Core\DeegraphServer; -use Darksparrow\DeegraphInteractions\Interfaces\QueryResponseInterface; +use Darksparrow\DeegraphInteractions\Enumerators\HTTPMethod; +use Darksparrow\DeegraphInteractions\Interfaces\QueryInstanceInterface; use Darksparrow\DeegraphInteractions\QueryResponse\PutQueryResponse; use Darksparrow\DeegraphInteractions\Superclasses\QueryInstanceSuperclass; -final class PutQuery extends QueryInstanceSuperclass implements QueryResponseInterface +final class PutQuery extends QueryInstanceSuperclass implements QueryInstanceInterface { - public function RunQuery(DeegraphServer $deegraphServer) + public function RunQuery(DeegraphServer $deegraphServer): PutQueryResponse { $response = $deegraphServer->RunRawRequest( endpoint: "/api/v1/@query", - method: "POST", + method: HTTPMethod::POST, body: $this->QueryString, ); return new PutQueryResponse(response: $response); diff --git a/src/QueryInstance/SelectQuery.php b/src/QueryInstance/SelectQuery.php index eb54a3d..9bcb40e 100644 --- a/src/QueryInstance/SelectQuery.php +++ b/src/QueryInstance/SelectQuery.php @@ -3,17 +3,18 @@ namespace Darksparrow\DeegraphInteractions\QueryInstance; use Darksparrow\DeegraphInteractions\Core\DeegraphServer; +use Darksparrow\DeegraphInteractions\Enumerators\HTTPMethod; use Darksparrow\DeegraphInteractions\Interfaces\QueryInstanceInterface; use Darksparrow\DeegraphInteractions\QueryResponse\SelectQueryResponse; use Darksparrow\DeegraphInteractions\Superclasses\QueryInstanceSuperclass; final class SelectQuery extends QueryInstanceSuperclass implements QueryInstanceInterface { - public function RunQuery(DeegraphServer $deegraphServer) + public function RunQuery(DeegraphServer $deegraphServer): SelectQueryResponse { $response = $deegraphServer->RunRawRequest( endpoint: "/api/v1/@query", - method: "POST", + method: HTTPMethod::POST, body: $this->QueryString, ); return new SelectQueryResponse(response: $response); diff --git a/src/QueryResponse/SelectQueryResponse.php b/src/QueryResponse/SelectQueryResponse.php index 77294c2..076dfc8 100644 --- a/src/QueryResponse/SelectQueryResponse.php +++ b/src/QueryResponse/SelectQueryResponse.php @@ -2,6 +2,7 @@ namespace Darksparrow\DeegraphInteractions\QueryResponse; +use Darksparrow\DeegraphInteractions\DataStructures\QueryResponseRow; use Darksparrow\DeegraphInteractions\Interfaces\QueryResponseInterface; final class SelectQueryResponse implements QueryResponseInterface @@ -21,7 +22,7 @@ final class SelectQueryResponse implements QueryResponseInterface { $this->Rows = []; foreach($response["@rows"] as $row) - $this->Rows[] = QueryResponseRow::FromArray(array: $row); + $this->Rows[] = new QueryResponseRow(array: $row); $this->RowFormat = $response["@row_format"]; } } diff --git a/src/Superclasses/QueryInstanceSuperclass.php b/src/Superclasses/QueryInstanceSuperclass.php index 2bea448..c1a9ae9 100644 --- a/src/Superclasses/QueryInstanceSuperclass.php +++ b/src/Superclasses/QueryInstanceSuperclass.php @@ -22,6 +22,11 @@ class QueryInstanceSuperclass * @return string */ public function __toString(): string + { + return $this->AsString(); + } + + public function AsString(): string { return $this->QueryString; } diff --git a/src/Traits/QueryBuilderTrait.php b/src/Traits/QueryBuilderTrait.php index 0e8ea7b..b1a4b38 100755 --- a/src/Traits/QueryBuilderTrait.php +++ b/src/Traits/QueryBuilderTrait.php @@ -14,6 +14,17 @@ use ReflectionClass; trait QueryBuilderTrait { + /** + * Takes in a string and a pattern. + * If the string matches the pattern, it'll return the given string, if it doesn't, it'll throw an exception. + * + * @param string $target + * @param string $pattern + * + * @return string + * + * @throws QueryBuilderInvalidInputException + */ protected function RegexValidate(string $target, string $pattern): string { if(!preg_match(pattern: $pattern, subject: $target)) @@ -21,6 +32,14 @@ trait QueryBuilderTrait return $target; } + /** + * Ensures that the provided string is equal to empty string ("")) + * + * @param string $target + * + * @return void + * @throws QueryBuilderConflictingFieldAlreadyExistsException + */ protected function EnsureNotSet(string $target): void { if($target != "") @@ -35,7 +54,11 @@ trait QueryBuilderTrait } public function ValidateValues( - DeleteQueryBuilder|GrantQueryBuilder|InsertQueryBuilder|PutQueryBuilder|SelectQueryBuilder $target + DeleteQueryBuilder + |GrantQueryBuilder + |InsertQueryBuilder + |PutQueryBuilder + |SelectQueryBuilder $target ): void { $nameBase = "Darksparrow\\DeegraphPHP\\Attributes"; diff --git a/tests/QueryBuilderPutTest.php b/tests/QueryBuilderPutTest.php index 1334b7a..35c63da 100755 --- a/tests/QueryBuilderPutTest.php +++ b/tests/QueryBuilderPutTest.php @@ -9,23 +9,22 @@ final class QueryBuilderPutTest extends TestCase { public function testPutURIAtSafeWithValidData() { - $queryBuilder = new QueryBuilder(); - $query = $queryBuilder->Put() + $query = QueryBuilder::Put() ->URI("https://schemas.auxiliumsoftware.co.uk/v1/collection.json") - ->At(node: "970334ed-1f4f-465a-94d7-923a99698786", uwu: "todos") + ->At(relativePath: "{970334ed-1f4f-465a-94d7-923a99698786}/todos") ->Safe(); + self::assertEquals( expected: 'PUT URI "https://schemas.auxiliumsoftware.co.uk/v1/collection.json" AT {970334ed-1f4f-465a-94d7-923a99698786}/todos SAFE', - actual: $query + actual: $query->Build()->AsString(), ); } public function testPutWithBothThings() { $this->expectException(QueryBuilderConflictingFieldAlreadyExistsException::class); - $queryBuilder = new QueryBuilder(); - $query = $queryBuilder->Put() + $query = QueryBuilder::Put() ->URI("https://schemas.auxiliumsoftware.co.uk/v1/collection.json") - ->At(node: "970334ed-1f4f-465a-94d7-923a99698786", uwu: "todos") + ->At(relativePath: "{970334ed-1f4f-465a-94d7-923a99698786}/todos") ->Into(relativePath: "Relative Path", propertyName: "OwO") ->Safe(); }