Cerys Lewis
7 months ago
6 changed files with 202 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||
<?php |
|||
|
|||
namespace Darksparrow\DeegraphPHP\Exceptions; |
|||
|
|||
use Exception; |
|||
|
|||
class QueryBuilderConflictingFieldAlreadyExistsException extends Exception |
|||
{ |
|||
public function __construct( |
|||
string $message = "You have tried to set a field which would nullify a field you've previously set.", |
|||
int $code = 422 |
|||
) { |
|||
parent::__construct($message, $code); |
|||
$this->message = "$message"; |
|||
$this->code = $code; |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
<?php |
|||
|
|||
namespace Darksparrow\DeegraphPHP\Exceptions; |
|||
|
|||
use Exception; |
|||
|
|||
class QueryBuilderInvalidInputException extends Exception |
|||
{ |
|||
public function __construct( |
|||
string $message = "The value you have entered doesn't pass regex validation.", |
|||
int $code = 422 |
|||
) { |
|||
parent::__construct($message, $code); |
|||
$this->message = "$message"; |
|||
$this->code = $code; |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
<?php |
|||
|
|||
namespace Darksparrow\DeegraphPHP\Exceptions; |
|||
|
|||
use Exception; |
|||
|
|||
class QueryBuilderRequiredFieldIsNotSetException extends Exception |
|||
{ |
|||
public function __construct( |
|||
string $message = "A field that is required for this operation has not been set.", |
|||
int $code = 422 |
|||
) { |
|||
parent::__construct($message, $code); |
|||
$this->message = "$message"; |
|||
$this->code = $code; |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
<?php |
|||
|
|||
namespace Darksparrow\DeegraphPHP\QueryBuilder; |
|||
|
|||
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders\Insert; |
|||
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders\Put; |
|||
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders\Select; |
|||
|
|||
class QueryBuilder |
|||
{ |
|||
public function Put(): Put |
|||
{ |
|||
return new Put(); |
|||
} |
|||
} |
@ -0,0 +1,23 @@ |
|||
<?php |
|||
|
|||
namespace Darksparrow\DeegraphPHP\QueryBuilder; |
|||
|
|||
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderConflictingFieldAlreadyExistsException; |
|||
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderException; |
|||
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderInvalidInputException; |
|||
|
|||
trait QueryBuilderTrait |
|||
{ |
|||
protected function Validate(string $target, string $pattern): string |
|||
{ |
|||
if (!preg_match(pattern: $pattern, subject: $target)) |
|||
throw new QueryBuilderInvalidInputException(); |
|||
return $target; |
|||
} |
|||
|
|||
protected function EnsureNotSet(string $target): void |
|||
{ |
|||
if ($target != "") |
|||
throw new QueryBuilderConflictingFieldAlreadyExistsException(); |
|||
} |
|||
} |
@ -0,0 +1,113 @@ |
|||
<?php |
|||
|
|||
namespace Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders; |
|||
|
|||
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderConflictingFieldAlreadyExistsException; |
|||
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderInvalidInputException; |
|||
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderRequiredFieldIsNotSetException; |
|||
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilderTrait; |
|||
|
|||
final class Put |
|||
{ |
|||
use QueryBuilderTrait; |
|||
|
|||
protected string $PutWhat = ""; |
|||
protected string $PutAt = ""; |
|||
protected string $PutInto = ""; |
|||
protected bool $Safe = false; |
|||
|
|||
|
|||
public function __construct() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* @throws QueryBuilderRequiredFieldIsNotSetException |
|||
*/ |
|||
public function __toString(): string |
|||
{ |
|||
$builder = "PUT"; |
|||
if($this->PutWhat != "") $builder .= " $this->PutWhat"; |
|||
|
|||
if($this->PutAt != "") $builder .= " $this->PutAt"; |
|||
elseif ($this->PutInto != "") $builder .= " $this->PutInto"; |
|||
else throw new QueryBuilderRequiredFieldIsNotSetException(); |
|||
|
|||
if($this->Safe) $builder .= " SAFE"; |
|||
return $builder; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @throws QueryBuilderInvalidInputException |
|||
*/ |
|||
public function Schema(string $uri): Put |
|||
{ |
|||
$this->PutWhat = self::Validate( |
|||
target: "SCHEMA \"$uri\"", |
|||
pattern: "/SCHEMA \".+\"/" |
|||
); |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* @throws QueryBuilderInvalidInputException |
|||
*/ |
|||
public function URI(string $uri): Put |
|||
{ |
|||
$this->PutWhat = self::Validate( |
|||
target: "URI \"$uri\"", |
|||
pattern: "/URI \".+\"/" |
|||
); |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* @throws QueryBuilderInvalidInputException |
|||
*/ |
|||
public function DataURI(string $mimeType, string $data): Put |
|||
{ |
|||
$this->PutWhat = self::Validate( |
|||
target: "URI \"data:$mimeType;$data\"", |
|||
pattern: "/URI \"data:[a-zA-Z0-9]/[a-zA-Z0-9];.+\"/" |
|||
); |
|||
return $this; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @throws QueryBuilderInvalidInputException |
|||
* @throws QueryBuilderConflictingFieldAlreadyExistsException |
|||
*/ |
|||
public function At(string $node, string $uwu): Put |
|||
{ |
|||
self::EnsureNotSet($this->PutInto); |
|||
$this->PutAt = self::Validate( |
|||
target: 'AT {' . $node . '}/' . $uwu, |
|||
pattern: "/AT {[a-zA-Z0-9\-]+}\/[a-zA-Z0-9]+/" |
|||
); |
|||
return $this; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @throws QueryBuilderInvalidInputException |
|||
* @throws QueryBuilderConflictingFieldAlreadyExistsException |
|||
*/ |
|||
public function Into(string $relativePath, string $propertyName): Put |
|||
{ |
|||
self::EnsureNotSet($this->PutAt); |
|||
$this->PutInto = self::Validate( |
|||
target: "INTO \"$relativePath\" AS \"$propertyName\"", |
|||
pattern: "/INTO \"[a-zA-Z0-9\-]+\" AS \"[a-zA-Z0-9]+\"/" |
|||
); |
|||
return $this; |
|||
} |
|||
|
|||
|
|||
public function Safe(): Put |
|||
{ |
|||
$this->Safe = true; |
|||
return $this; |
|||
} |
|||
} |
Loading…
Reference in new issue