diff --git a/Core/API/ApiKeyAPI.class.php b/Core/API/ApiKeyAPI.class.php index 99d7676..0d28f76 100644 --- a/Core/API/ApiKeyAPI.class.php +++ b/Core/API/ApiKeyAPI.class.php @@ -15,10 +15,10 @@ namespace Core\API { $sql = $this->context->getSQL(); $res = $sql->select($sql->count()) ->from("ApiKey") - ->where(new Compare("id", $id)) - ->where(new Compare("user_id", $this->context->getUser()->getId())) - ->where(new Compare("valid_until", $sql->currentTimestamp(), ">")) - ->where(new Compare("active", 1)) + ->whereEq("id", $id) + ->whereEq("user_id", $this->context->getUser()->getId()) + ->whereGt("valid_until", $sql->currentTimestamp()) + ->whereEq("active", 1) ->execute(); $this->success = ($res !== FALSE); @@ -120,12 +120,12 @@ namespace Core\API\ApiKey { return false; } - $validUntil = (new \DateTime)->modify("+30 DAY"); + $validUntil = (new \DateTime())->modify("+30 DAY"); $sql = $this->context->getSQL(); $this->success = $sql->update("ApiKey") ->set("valid_until", $validUntil) - ->where(new Compare("id", $id)) - ->where(new Compare("user_id", $this->context->getUser()->getId())) + ->whereEq("id", $id) + ->whereEq("user_id", $this->context->getUser()->getId()) ->execute(); $this->lastError = $sql->getLastError(); @@ -155,8 +155,8 @@ namespace Core\API\ApiKey { $sql = $this->context->getSQL(); $this->success = $sql->update("ApiKey") ->set("active", false) - ->where(new Compare("id", $id)) - ->where(new Compare("user_id", $this->context->getUser()->getId())) + ->whereEq("id", $id) + ->whereEq("user_id", $this->context->getUser()->getId()) ->execute(); $this->lastError = $sql->getLastError(); diff --git a/Core/API/GroupsAPI.class.php b/Core/API/GroupsAPI.class.php index 2fa975a..42075a0 100644 --- a/Core/API/GroupsAPI.class.php +++ b/Core/API/GroupsAPI.class.php @@ -15,7 +15,7 @@ namespace Core\API { $sql = $this->context->getSQL(); $res = $sql->select($sql->count()) ->from("Group") - ->where(new Compare("name", $name)) + ->whereEq("name", $name) ->execute(); $this->success = ($res !== FALSE); diff --git a/Core/API/LanguageAPI.class.php b/Core/API/LanguageAPI.class.php index ea2f59b..acc94d8 100644 --- a/Core/API/LanguageAPI.class.php +++ b/Core/API/LanguageAPI.class.php @@ -94,7 +94,7 @@ namespace Core\API\Language { $this->success = $sql->update("User") ->set("language_id", $languageId) - ->where(new Compare("id", $userId)) + ->whereEq("id", $userId) ->execute(); $this->lastError = $sql->getLastError(); diff --git a/Core/API/MailAPI.class.php b/Core/API/MailAPI.class.php index c88c68c..9bf891f 100644 --- a/Core/API/MailAPI.class.php +++ b/Core/API/MailAPI.class.php @@ -223,8 +223,8 @@ namespace Core\API\Mail { $sql = $this->context->getSQL(); $mailQueueItems = MailQueueItem::findBy(MailQueueItem::createBuilder($sql, false) - ->where(new Compare("retryCount", 0, ">")) - ->where(new Compare("status", "waiting")) + ->whereGt("retryCount", 0) + ->whereEq("status", "waiting") ->where(new Compare("nextTry", $sql->now(), "<="))); $this->success = ($mailQueueItems !== false); diff --git a/Core/API/PermissionAPI.class.php b/Core/API/PermissionAPI.class.php index d6ae29f..b496511 100644 --- a/Core/API/PermissionAPI.class.php +++ b/Core/API/PermissionAPI.class.php @@ -183,7 +183,7 @@ namespace Core\API\Permission { if ($this->success) { $res = $sql->delete("ApiPermission") - ->where(new Compare("description", "")) // only delete non default permissions + ->whereEq("description", "") // only delete non default permissions ->where(new CondNot(new CondIn(new Column("method"), $insertedMethods))) ->execute(); diff --git a/Core/API/RoutesAPI.class.php b/Core/API/RoutesAPI.class.php index 0d63af1..fc61e1b 100644 --- a/Core/API/RoutesAPI.class.php +++ b/Core/API/RoutesAPI.class.php @@ -22,7 +22,7 @@ namespace Core\API { $sql = $this->context->getSQL(); $res = $sql->select($sql->count()) ->from("Route") - ->where(new Compare("id", $uid)) + ->whereEq("id", $uid) ->execute(); $this->success = ($res !== false); @@ -44,7 +44,7 @@ namespace Core\API { $sql = $this->context->getSQL(); $this->success = $sql->update("Route") ->set("active", $active) - ->where(new Compare("id", $uid)) + ->whereEq("id", $uid) ->execute(); $this->lastError = $sql->getLastError(); @@ -275,7 +275,7 @@ namespace Core\API\Routes { ->set("action", $action) ->set("target", $target) ->set("extra", $extra) - ->where(new Compare("id", $id)) + ->whereEq("id", $id) ->execute(); $this->lastError = $sql->getLastError(); @@ -294,14 +294,14 @@ namespace Core\API\Routes { public function _execute(): bool { - $uid = $this->getParam("id"); - if (!$this->routeExists($uid)) { + $id = $this->getParam("id"); + if (!$this->routeExists($id)) { return false; } $sql = $this->context->getSQL(); $this->success = $sql->delete("Route") - ->where(new Compare("id", $uid)) + ->where("id", $id) ->execute(); $this->lastError = $sql->getLastError(); diff --git a/Core/API/TfaAPI.class.php b/Core/API/TfaAPI.class.php index 5909e46..2ad6e69 100644 --- a/Core/API/TfaAPI.class.php +++ b/Core/API/TfaAPI.class.php @@ -86,7 +86,7 @@ namespace Core\API\TFA { if ($password) { $res = $sql->select("password") ->from("User") - ->where(new Compare("id", $currentUser->getId())) + ->whereEq("id", $currentUser->getId()) ->execute(); $this->success = !empty($res); $this->lastError = $sql->getLastError(); @@ -101,7 +101,7 @@ namespace Core\API\TFA { } $res = $sql->delete("2FA") - ->where(new Compare("id", $token->getId())) + ->whereEq("id", $token->getId()) ->execute(); $this->success = $res !== false; @@ -164,7 +164,8 @@ namespace Core\API\TFA { $this->lastError = $sql->getLastError(); if ($this->success) { $this->success = $sql->update("User") - ->set("2fa_id", $sql->getLastInsertId())->where(new Compare("id", $currentUser->getId())) + ->set("2fa_id", $sql->getLastInsertId()) + ->whereEq("id", $currentUser->getId()) ->execute() !== false; $this->lastError = $sql->getLastError(); } @@ -196,7 +197,7 @@ namespace Core\API\TFA { $sql = $this->context->getSQL(); $this->success = $sql->update("2FA") ->set("confirmed", true) - ->where(new Compare("id", $twoFactorToken->getId())) + ->whereEq("id", $twoFactorToken->getId()) ->execute() !== false; $this->lastError = $sql->getLastError(); return $this->success; @@ -282,7 +283,7 @@ namespace Core\API\TFA { $this->success = $sql->update("User") ->set("2fa_id", $sql->getLastInsertId()) - ->where(new Compare("id", $currentUser->getId())) + ->whereEq("id", $currentUser->getId()) ->execute() !== false; $this->lastError = $sql->getLastError(); if (!$this->success) { @@ -328,7 +329,7 @@ namespace Core\API\TFA { $this->success = $sql->update("2FA") ->set("data", json_encode($data)) ->set("confirmed", true) - ->where(new Compare("id", $twoFactorToken->getId())) + ->whereEq("id", $twoFactorToken->getId()) ->execute() !== false; $this->lastError = $sql->getLastError(); } diff --git a/Core/API/UserAPI.class.php b/Core/API/UserAPI.class.php index 4383fa2..b0a45eb 100644 --- a/Core/API/UserAPI.class.php +++ b/Core/API/UserAPI.class.php @@ -109,9 +109,9 @@ namespace Core\API { protected function checkToken(string $token) : UserToken|bool { $sql = $this->context->getSQL(); $userToken = UserToken::findBy(UserToken::createBuilder($sql, true) - ->where(new Compare("UserToken.token", $token)) - ->where(new Compare("UserToken.valid_until", $sql->now(), ">")) - ->where(new Compare("UserToken.used", 0)) + ->whereEq("UserToken.token", $token) + ->whereGt("UserToken.valid_until", $sql->now()) + ->whereFalse("UserToken.used") ->fetchEntities()); if ($userToken === false) { @@ -841,7 +841,7 @@ namespace Core\API\User { if ($user->save($sql)) { - $deleteQuery = $sql->delete("UserGroup")->where(new Compare("user_id", $id)); + $deleteQuery = $sql->delete("UserGroup")->whereEq("user_id", $id); $insertQuery = $sql->insert("UserGroup", array("user_id", "group_id")); foreach ($groupIds as $groupId) { @@ -928,7 +928,7 @@ namespace Core\API\User { $sql = $this->context->getSQL(); $email = $this->getParam("email"); $user = User::findBy(User::createBuilder($sql, true) - ->where(new Compare("email", $email)) + ->whereEq("email", $email) ->fetchEntities()); if ($user === false) { return $this->createError("Could not fetch user details: " . $sql->getLastError()); @@ -1009,8 +1009,8 @@ namespace Core\API\User { $email = $this->getParam("email"); $sql = $this->context->getSQL(); $user = User::findBy(User::createBuilder($sql, true) - ->where(new Compare("User.email", $email)) - ->where(new Compare("User.confirmed", false))); + ->whereEq("User.email", $email) + ->whereFalse("User.confirmed")); if ($user === false) { return $this->createError("Error retrieving user details: " . $sql->getLastError()); @@ -1020,9 +1020,9 @@ namespace Core\API\User { } $userToken = UserToken::findBy(UserToken::createBuilder($sql, true) - ->where(new Compare("used", false)) - ->where(new Compare("tokenType", UserToken::TYPE_EMAIL_CONFIRM)) - ->where(new Compare("user_id", $user->getId()))); + ->whereFalse("used") + ->whereEq("tokenType", UserToken::TYPE_EMAIL_CONFIRM) + ->whereEq("user_id", $user->getId())); $validHours = 48; if ($userToken === false) { @@ -1333,10 +1333,10 @@ namespace Core\API\User { $sql = $this->context->getSQL(); $userToken = UserToken::findBy(UserToken::createBuilder($sql, true) - ->where(new Compare("token", $token)) + ->whereEq("token", $token) ->where(new Compare("valid_until", $sql->now(), ">=")) - ->where(new Compare("user_id", $currentUser->getId())) - ->where(new Compare("token_type", UserToken::TYPE_GPG_CONFIRM))); + ->whereEq("user_id", $currentUser->getId()) + ->whereEq("token_type", UserToken::TYPE_GPG_CONFIRM)); if ($userToken !== false) { if ($userToken === null) { diff --git a/Core/API/VisitorsAPI.class.php b/Core/API/VisitorsAPI.class.php index 6068bfc..2555397 100644 --- a/Core/API/VisitorsAPI.class.php +++ b/Core/API/VisitorsAPI.class.php @@ -84,7 +84,7 @@ namespace Core\API\Visitors { $sql = $this->context->getSQL(); $query = $sql->select($sql->count(), "day") ->from("Visitor") - ->where(new Compare("count", 1, ">")) + ->whereGt("count", 1) ->groupBy("day") ->orderBy("day") ->ascending(); diff --git a/Core/Configuration/Patch/EntityLog_2021_04_08.class.php b/Core/Configuration/Patch/EntityLog_2021_04_08.class.php index 61f8c4c..eb4d451 100644 --- a/Core/Configuration/Patch/EntityLog_2021_04_08.class.php +++ b/Core/Configuration/Patch/EntityLog_2021_04_08.class.php @@ -39,8 +39,8 @@ class EntityLog_2021_04_08 extends DatabaseScript { ->exec(array( $sql->update("EntityLog") ->set("modified", $sql->now()) - ->where(new Compare("entityId", new CurrentColumn("id"))) - ->where(new Compare("tableName", new CurrentTable())) + ->whereEq("entityId", new CurrentColumn("id")) + ->whereEq("tableName", new CurrentTable()) )); $deleteProcedure = $sql->createProcedure("DeleteEntityLog") @@ -49,8 +49,8 @@ class EntityLog_2021_04_08 extends DatabaseScript { ->returns(new Trigger()) ->exec(array( $sql->delete("EntityLog") - ->where(new Compare("entityId", new CurrentColumn("id"))) - ->where(new Compare("tableName", new CurrentTable())) + ->whereEq("entityId", new CurrentColumn("id")) + ->whereEq("tableName", new CurrentTable()) )); $queries[] = $insertProcedure; diff --git a/Core/Driver/SQL/Join/InnerJoin.class.php b/Core/Driver/SQL/Join/InnerJoin.class.php new file mode 100644 index 0000000..7bff8a5 --- /dev/null +++ b/Core/Driver/SQL/Join/InnerJoin.class.php @@ -0,0 +1,9 @@ +conditions = []; + } + + public function getWhereClause(array &$params): string { + return $this->sql->getWhereClause($this->getConditions(), $params); + } + + public function getConditions(): array { + return $this->conditions; + } + + + public function where(...$conditions): static { + $this->conditions[] = (count($conditions) === 1 ? $conditions : new CondOr($conditions)); + return $this; + } + + public function whereEq(string $col, mixed $val): static { + $this->conditions[] = new Compare($col, $val, "="); + return $this; + } + + public function whereNeq(string $col, mixed $val): static { + $this->conditions[] = new Compare($col, $val, "!="); + return $this; + } + + public function whereGt(string $col, mixed $val): static { + $this->conditions[] = new Compare($col, $val, ">"); + return $this; + } + + public function whereLt(string $col, mixed $val): static { + $this->conditions[] = new Compare($col, $val, "<"); + return $this; + } + + public function whereTrue(string $col): static { + $this->conditions[] = new CondBool($col); + return $this; + } + + public function whereFalse(string $col): static { + $this->conditions[] = new CondNot(new CondBool($col)); + return $this; + } +} \ No newline at end of file diff --git a/Core/Driver/SQL/Query/Delete.class.php b/Core/Driver/SQL/Query/Delete.class.php index 2610c17..35db7a3 100644 --- a/Core/Driver/SQL/Query/Delete.class.php +++ b/Core/Driver/SQL/Query/Delete.class.php @@ -5,28 +5,20 @@ namespace Core\Driver\SQL\Query; use Core\Driver\SQL\Condition\CondOr; use Core\Driver\SQL\SQL; -class Delete extends Query { +class Delete extends ConditionalQuery { private string $table; - private array $conditions; public function __construct(SQL $sql, string $table) { parent::__construct($sql); $this->table = $table; - $this->conditions = array(); - } - - public function where(...$conditions): Delete { - $this->conditions[] = (count($conditions) === 1 ? $conditions : new CondOr($conditions)); - return $this; } public function getTable(): string { return $this->table; } - public function getConditions(): array { return $this->conditions; } public function build(array &$params): ?string { $table = $this->sql->tableName($this->getTable()); - $where = $this->sql->getWhereClause($this->getConditions(), $params); + $where = $this->getWhereClause($params); return "DELETE FROM $table$where"; } } diff --git a/Core/Driver/SQL/Query/Select.class.php b/Core/Driver/SQL/Query/Select.class.php index a77f0ac..3800bc0 100644 --- a/Core/Driver/SQL/Query/Select.class.php +++ b/Core/Driver/SQL/Query/Select.class.php @@ -4,14 +4,15 @@ namespace Core\Driver\SQL\Query; use Core\Driver\SQL\Condition\CondOr; use Core\Driver\SQL\Expression\JsonArrayAgg; -use Core\Driver\SQL\Join; +use Core\Driver\SQL\Join\InnerJoin; +use Core\Driver\SQL\Join\Join; +use Core\Driver\SQL\Join\LeftJoin; use Core\Driver\SQL\SQL; -class Select extends Query { +class Select extends ConditionalQuery { private array $selectValues; private array $tables; - private array $conditions; private array $joins; private array $orderColumns; private array $groupColumns; @@ -26,7 +27,6 @@ class Select extends Query { parent::__construct($sql); $this->selectValues = (!empty($selectValues) && is_array($selectValues[0])) ? $selectValues[0] : $selectValues; $this->tables = array(); - $this->conditions = array(); $this->havings = array(); $this->joins = array(); $this->orderColumns = array(); @@ -53,23 +53,18 @@ class Select extends Query { return $this; } - public function where(...$conditions): Select { - $this->conditions[] = (count($conditions) === 1 ? $conditions : new CondOr($conditions)); - return $this; - } - public function having(...$conditions): Select { $this->havings[] = (count($conditions) === 1 ? $conditions : new CondOr($conditions)); return $this; } public function innerJoin(string $table, string $columnA, string $columnB, ?string $tableAlias = null, array $conditions = []): Select { - $this->joins[] = new Join("INNER", $table, $columnA, $columnB, $tableAlias, $conditions); + $this->joins[] = new InnerJoin($table, $columnA, $columnB, $tableAlias, $conditions); return $this; } public function leftJoin(string $table, string $columnA, string $columnB, ?string $tableAlias = null, array $conditions = []): Select { - $this->joins[] = new Join("LEFT", $table, $columnA, $columnB, $tableAlias, $conditions); + $this->joins[] = new LeftJoin($table, $columnA, $columnB, $tableAlias, $conditions); return $this; } @@ -133,7 +128,6 @@ class Select extends Query { public function getSelectValues(): array { return $this->selectValues; } public function getTables(): array { return $this->tables; } - public function getConditions(): array { return $this->conditions; } public function getJoins(): array { return $this->joins; } public function isOrderedAscending(): bool { return $this->sortAscending; } public function getOrderBy(): array { return $this->orderColumns; } @@ -180,7 +174,7 @@ class Select extends Query { } $tables = $this->sql->tableName($tables); - $where = $this->sql->getWhereClause($this->getConditions(), $params); + $where = $this->getWhereClause($params); $havingClause = ""; if (count($this->havings) > 0) { $havingClause = " HAVING " . $this->sql->buildCondition($this->getHavings(), $params); diff --git a/Core/Driver/SQL/Query/Update.class.php b/Core/Driver/SQL/Query/Update.class.php index 697b3b2..5e13873 100644 --- a/Core/Driver/SQL/Query/Update.class.php +++ b/Core/Driver/SQL/Query/Update.class.php @@ -2,25 +2,17 @@ namespace Core\Driver\SQL\Query; -use Core\Driver\SQL\Condition\CondOr; use Core\Driver\SQL\SQL; -class Update extends Query { +class Update extends ConditionalQuery { private array $values; private string $table; - private array $conditions; public function __construct(SQL $sql, string $table) { parent::__construct($sql); $this->values = array(); $this->table = $table; - $this->conditions = array(); - } - - public function where(...$conditions): Update { - $this->conditions[] = (count($conditions) === 1 ? $conditions : new CondOr($conditions)); - return $this; } public function set(string $key, $val): Update { @@ -29,7 +21,6 @@ class Update extends Query { } public function getTable(): string { return $this->table; } - public function getConditions(): array { return $this->conditions; } public function getValues(): array { return $this->values; } public function build(array &$params): ?string { @@ -41,7 +32,7 @@ class Update extends Query { } $valueStr = implode(",", $valueStr); - $where = $this->sql->getWhereClause($this->getConditions(), $params); + $where = $this->getWhereClause($params); return "UPDATE $table SET $valueStr$where"; } } \ No newline at end of file diff --git a/Core/External/composer.lock b/Core/External/composer.lock index e5f68ed..d89c499 100644 --- a/Core/External/composer.lock +++ b/Core/External/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "af894b476b8bab945acf32399608ac5f", + "content-hash": "dc183c367dc010feed9b7ddaa7d54559", "packages": [ { "name": "beberlei/assert", @@ -135,20 +135,20 @@ }, { "name": "chillerlan/php-qrcode", - "version": "4.3.3", + "version": "4.3.4", "source": { "type": "git", "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "6356b246948ac1025882b3f55e7c68ebd4515ae3" + "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/6356b246948ac1025882b3f55e7c68ebd4515ae3", - "reference": "6356b246948ac1025882b3f55e7c68ebd4515ae3", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d", + "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d", "shasum": "" }, "require": { - "chillerlan/php-settings-container": "^2.1", + "chillerlan/php-settings-container": "^2.1.4", "ext-mbstring": "*", "php": "^7.4 || ^8.0" }, @@ -197,7 +197,7 @@ ], "support": { "issues": "https://github.com/chillerlan/php-qrcode/issues", - "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.3" + "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.4" }, "funding": [ { @@ -209,20 +209,20 @@ "type": "ko_fi" } ], - "time": "2021-11-25T22:38:09+00:00" + "time": "2022-07-25T09:12:45+00:00" }, { "name": "chillerlan/php-settings-container", - "version": "2.1.3", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "125dd573b45ffc7cabecf385986a356ba2c6f602" + "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/125dd573b45ffc7cabecf385986a356ba2c6f602", - "reference": "125dd573b45ffc7cabecf385986a356ba2c6f602", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/1beb7df3c14346d4344b0b2e12f6f9a74feabd4a", + "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a", "shasum": "" }, "require": { @@ -273,7 +273,7 @@ "type": "ko_fi" } ], - "time": "2022-03-09T13:18:58+00:00" + "time": "2022-07-05T22:32:14+00:00" }, { "name": "christian-riesen/base32", @@ -411,16 +411,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.2.0", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "d28e6df83830252650da4623c78aaaf98fb385f3" + "reference": "ddfaddcb520488b42bca3a75e17e9dd53c3667da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d28e6df83830252650da4623c78aaaf98fb385f3", - "reference": "d28e6df83830252650da4623c78aaaf98fb385f3", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/ddfaddcb520488b42bca3a75e17e9dd53c3667da", + "reference": "ddfaddcb520488b42bca3a75e17e9dd53c3667da", "shasum": "" }, "require": { @@ -467,22 +467,63 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.2.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.3.1" }, - "time": "2022-05-13T20:54:50+00:00" + "time": "2022-11-01T21:20:08+00:00" }, { - "name": "myclabs/php-enum", - "version": "1.8.3", + "name": "html2text/html2text", + "version": "4.3.1", "source": { "type": "git", - "url": "https://github.com/myclabs/php-enum.git", - "reference": "b942d263c641ddb5190929ff840c68f78713e937" + "url": "https://github.com/mtibben/html2text.git", + "reference": "61ad68e934066a6f8df29a3d23a6460536d0855c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", - "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "url": "https://api.github.com/repos/mtibben/html2text/zipball/61ad68e934066a6f8df29a3d23a6460536d0855c", + "reference": "61ad68e934066a6f8df29a3d23a6460536d0855c", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-mbstring": "For best performance", + "symfony/polyfill-mbstring": "If you can't install ext-mbstring" + }, + "type": "library", + "autoload": { + "psr-4": { + "Html2Text\\": [ + "src/", + "test/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Converts HTML to formatted plain text", + "support": { + "issues": "https://github.com/mtibben/html2text/issues", + "source": "https://github.com/mtibben/html2text/tree/4.3.1" + }, + "time": "2020-04-16T23:44:31+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", "shasum": "" }, "require": { @@ -498,7 +539,10 @@ "autoload": { "psr-4": { "MyCLabs\\Enum\\": "src/" - } + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -517,7 +561,7 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" }, "funding": [ { @@ -529,20 +573,20 @@ "type": "tidelift" } ], - "time": "2021-07-05T08:18:36+00:00" + "time": "2022-08-04T09:53:51+00:00" }, { "name": "php-mqtt/client", - "version": "v1.4.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/php-mqtt/client.git", - "reference": "d54381306e68baf7c2c089392c0c6d1d06e278c6" + "reference": "22a207edef01d5f0ed3a6a79565cc425b678d786" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mqtt/client/zipball/d54381306e68baf7c2c089392c0c6d1d06e278c6", - "reference": "d54381306e68baf7c2c089392c0c6d1d06e278c6", + "url": "https://api.github.com/repos/php-mqtt/client/zipball/22a207edef01d5f0ed3a6a79565cc425b678d786", + "reference": "22a207edef01d5f0ed3a6a79565cc425b678d786", "shasum": "" }, "require": { @@ -584,36 +628,36 @@ ], "support": { "issues": "https://github.com/php-mqtt/client/issues", - "source": "https://github.com/php-mqtt/client/tree/v1.4.0" + "source": "https://github.com/php-mqtt/client/tree/v1.6.0" }, - "time": "2022-06-15T19:19:03+00:00" + "time": "2022-11-01T20:00:19+00:00" }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -634,9 +678,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "spomky-labs/cbor-php", @@ -720,16 +764,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -744,7 +788,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -782,7 +826,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -798,20 +842,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -826,7 +870,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -865,7 +909,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -881,20 +925,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "twig/twig", - "version": "v3.4.1", + "version": "v3.4.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342" + "reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/e939eae92386b69b49cfa4599dd9bead6bf4a342", - "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/c38fd6b0b7f370c198db91ffd02e23b517426b58", + "reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58", "shasum": "" }, "require": { @@ -945,7 +989,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.4.1" + "source": "https://github.com/twigphp/Twig/tree/v3.4.3" }, "funding": [ { @@ -957,7 +1001,7 @@ "type": "tidelift" } ], - "time": "2022-05-17T05:48:52+00:00" + "time": "2022-09-28T08:42:51+00:00" }, { "name": "web-auth/cose-lib", @@ -1155,16 +1199,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -1205,9 +1249,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-05-31T20:59:12+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "phar-io/manifest", @@ -1320,252 +1364,25 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, { "name": "phpunit/php-code-coverage", - "version": "9.2.15", + "version": "9.2.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -1614,7 +1431,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" }, "funding": [ { @@ -1622,7 +1439,7 @@ "type": "github" } ], - "time": "2022-03-07T09:28:20+00:00" + "time": "2022-11-18T07:47:47+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1867,16 +1684,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.20", + "version": "9.5.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", "shasum": "" }, "require": { @@ -1891,7 +1708,6 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", @@ -1899,20 +1715,16 @@ "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -1954,7 +1766,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" }, "funding": [ { @@ -1964,9 +1776,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-04-01T12:37:26+00:00" + "time": "2022-10-28T06:00:21+00:00" }, { "name": "sebastian/cli-parser", @@ -2137,16 +1953,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -2199,7 +2015,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -2207,7 +2023,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -2397,16 +2213,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -2462,7 +2278,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -2470,7 +2286,7 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", @@ -2825,16 +2641,16 @@ }, { "name": "sebastian/type", - "version": "3.0.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { @@ -2846,7 +2662,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2869,7 +2685,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" }, "funding": [ { @@ -2877,7 +2693,7 @@ "type": "github" } ], - "time": "2022-03-15T09:54:48+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { "name": "sebastian/version", @@ -2981,64 +2797,6 @@ } ], "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" } ], "aliases": [], @@ -3048,5 +2806,5 @@ "prefer-lowest": false, "platform": [], "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } diff --git a/Core/Objects/Context.class.php b/Core/Objects/Context.class.php index df5f235..459df9f 100644 --- a/Core/Objects/Context.class.php +++ b/Core/Objects/Context.class.php @@ -7,7 +7,7 @@ use Core\Configuration\Settings; use Core\Driver\SQL\Condition\Compare; use Core\Driver\SQL\Condition\CondLike; use Core\Driver\SQL\Condition\CondOr; -use Core\Driver\SQL\Join; +use Core\Driver\SQL\Join\InnerJoin; use Core\Driver\SQL\SQL; use Firebase\JWT\JWT; use Core\Objects\DatabaseEntity\Language; @@ -179,11 +179,11 @@ class Context { public function loadApiKey(string $apiKey): bool { $this->user = User::findBy(User::createBuilder($this->sql, true) - ->addJoin(new Join("INNER","ApiKey", "ApiKey.user_id", "User.id")) - ->where(new Compare("ApiKey.api_key", $apiKey)) - ->where(new Compare("valid_until", $this->sql->currentTimestamp(), ">")) - ->where(new Compare("ApiKey.active", true)) - ->where(new Compare("User.confirmed", true)) + ->addJoin(new InnerJoin("ApiKey", "ApiKey.user_id", "User.id")) + ->whereEq("ApiKey.api_key", $apiKey) + ->whereGt("valid_until", $this->sql->currentTimestamp()) + ->whereTrue("ApiKey.active", true) + ->whereTrue("User.confirmed", true) ->fetchEntities()); return $this->user !== null; diff --git a/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php b/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php index 3814efb..c718c9b 100644 --- a/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php +++ b/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php @@ -40,7 +40,7 @@ abstract class DatabaseEntity { $handler = self::getHandler($sql); if ($fetchEntities) { return DatabaseEntityQuery::fetchOne(self::getHandler($sql)) - ->where(new Compare($handler->getTableName() . ".id", $id)) + ->whereEq($handler->getTableName() . ".id", $id) ->fetchEntities($fetchRecursive) ->execute(); } else { @@ -52,7 +52,7 @@ abstract class DatabaseEntity { $handler = self::getHandler($sql); $res = $sql->select($sql->count()) ->from($handler->getTableName()) - ->where(new Compare($handler->getTableName() . ".id", $id)) + ->whereEq($handler->getTableName() . ".id", $id) ->execute(); return $res !== false && $res[0]["count"] !== 0; diff --git a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php index 180afca..fc91b08 100644 --- a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php +++ b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php @@ -20,7 +20,7 @@ use Core\Driver\SQL\Column\FloatColumn; use Core\Driver\SQL\Condition\CondNot; use Core\Driver\SQL\Condition\CondOr; use Core\Driver\SQL\Constraint\ForeignKey; -use Core\Driver\SQL\Join; +use Core\Driver\SQL\Join\InnerJoin; use Core\Driver\SQL\Query\CreateProcedure; use Core\Driver\SQL\Query\CreateTable; use Core\Driver\SQL\Query\Insert; @@ -323,7 +323,7 @@ class DatabaseEntityHandler implements Persistable { // delete from n:m table if no longer exists $deleteStatement = $this->sql->delete($nmTable) - ->where(new Compare($thisIdColumn, $entity->getId())); + ->whereEq($thisIdColumn, $entity->getId()); if (!empty($dataColumns)) { $conditions = []; @@ -439,9 +439,8 @@ class DatabaseEntityHandler implements Persistable { $dataColumns = $nmRelation->getDataColumns(); $relEntityQuery = DatabaseEntityQuery::fetchAll($otherHandler) - ->addJoin(new Join("INNER", $nmTable, "$nmTable.$refIdColumn", "$refTableName.id")) - ->where(new CondIn(new Column($thisIdColumn), $entityIds)) - ->getQuery(); + ->addJoin(new InnerJoin($nmTable, "$nmTable.$refIdColumn", "$refTableName.id")) + ->where(new CondIn(new Column($thisIdColumn), $entityIds)); $relEntityQuery->addColumn($thisIdColumn); foreach ($dataColumns as $tableDataColumns) { @@ -498,7 +497,7 @@ class DatabaseEntityHandler implements Persistable { public function fetchOne(int $id): DatabaseEntity|bool|null { $res = $this->getSelectQuery() - ->where(new Compare($this->tableName . ".id", $id)) + ->whereEq($this->tableName . ".id", $id) ->first() ->execute(); @@ -637,7 +636,7 @@ class DatabaseEntityHandler implements Persistable { $entity->preInsert($row); $query = $this->sql->update($this->tableName) - ->where(new Compare($this->tableName . ".id", $entity->getId())); + ->whereEq($this->tableName . ".id", $entity->getId()); foreach ($row as $columnName => $value) { $query->set($columnName, $value); @@ -693,7 +692,7 @@ class DatabaseEntityHandler implements Persistable { public function delete(int $id) { return $this->sql ->delete($this->tableName) - ->where(new Compare($this->tableName . ".id", $id)) + ->whereEq($this->tableName . ".id", $id) ->execute(); } diff --git a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php index add000e..00c8e3a 100644 --- a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php +++ b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php @@ -12,7 +12,7 @@ use Core\Driver\SQL\SQL; * this class is similar to \Driver\SQL\Query\Select but with reduced functionality * and more adapted to entities. */ -class DatabaseEntityQuery { +class DatabaseEntityQuery extends Select { const FETCH_NONE = 0; const FETCH_DIRECT = 1; @@ -20,22 +20,22 @@ class DatabaseEntityQuery { private Logger $logger; private DatabaseEntityHandler $handler; - private Select $selectQuery; private int $resultType; private bool $logVerbose; private int $fetchSubEntities; private function __construct(DatabaseEntityHandler $handler, int $resultType) { + parent::__construct($handler->getSQL(), ...$handler->getColumnNames()); $this->handler = $handler; - $this->selectQuery = $handler->getSelectQuery(); $this->logger = new Logger("DB-EntityQuery", $handler->getSQL()); $this->resultType = $resultType; $this->logVerbose = false; - $this->fetchSubEntities = self::FETCH_NONE; + $this->from($handler->getTableName()); + $this->fetchSubEntities = self::FETCH_NONE; if ($this->resultType === SQL::FETCH_ONE) { - $this->selectQuery->first(); + $this->first(); } } @@ -52,36 +52,6 @@ class DatabaseEntityQuery { return new DatabaseEntityQuery($handler, SQL::FETCH_ONE); } - public function limit(int $limit): DatabaseEntityQuery { - $this->selectQuery->limit($limit); - return $this; - } - - public function offset(int $offset): static { - $this->selectQuery->offset($offset); - return $this; - } - - public function where(Condition ...$condition): DatabaseEntityQuery { - $this->selectQuery->where(...$condition); - return $this; - } - - public function orderBy(string ...$column): DatabaseEntityQuery { - $this->selectQuery->orderBy(...$column); - return $this; - } - - public function ascending(): DatabaseEntityQuery { - $this->selectQuery->ascending(); - return $this; - } - - public function descending(): DatabaseEntityQuery { - $this->selectQuery->descending(); - return $this; - } - // TODO: clean this up public function fetchEntities(bool $recursive = false): DatabaseEntityQuery { @@ -110,9 +80,9 @@ class DatabaseEntityQuery { if ($isNullable) { - $this->selectQuery->leftJoin($referencedTable, "$tableName.$foreignColumnName", "$alias.id", $alias); + $this->leftJoin($referencedTable, "$tableName.$foreignColumnName", "$alias.id", $alias); } else { - $this->selectQuery->innerJoin($referencedTable, "$tableName.$foreignColumnName", "$alias.id", $alias); + $this->innerJoin($referencedTable, "$tableName.$foreignColumnName", "$alias.id", $alias); } $relationColumnPrefix .= DatabaseEntityHandler::getColumnName($propertyName) . "_"; @@ -120,7 +90,7 @@ class DatabaseEntityQuery { foreach ($relationHandler->getColumns() as $relPropertyName => $relColumn) { $relColumnName = $relColumn->getName(); if (!isset($recursiveRelations[$relPropertyName]) || $recursive) { - $this->selectQuery->addValue("$alias.$relColumnName as $relationColumnPrefix$relColumnName"); + $this->addValue("$alias.$relColumnName as $relationColumnPrefix$relColumnName"); if (isset($recursiveRelations[$relPropertyName]) && $recursive) { $this->fetchRelation($relPropertyName, $alias, $relationHandler, $recursiveRelations[$relPropertyName], $relIndex, $recursive, $relationColumnPrefix); } @@ -132,11 +102,11 @@ class DatabaseEntityQuery { if ($this->logVerbose) { $params = []; - $query = $this->selectQuery->build($params); + $query = $this->build($params); $this->logger->debug("QUERY: $query\nARGS: " . print_r($params, true)); } - $res = $this->selectQuery->execute(); + $res = parent::execute(); if ($res === null || $res === false) { return null; } @@ -167,13 +137,4 @@ class DatabaseEntityQuery { return null; } } - - public function addJoin(Join $join): DatabaseEntityQuery { - $this->selectQuery->addJoin($join); - return $this; - } - - public function getQuery(): Select { - return $this->selectQuery; - } } \ No newline at end of file diff --git a/cli.php b/cli.php index 6d5f6c0..3d1ab6e 100644 --- a/cli.php +++ b/cli.php @@ -616,7 +616,7 @@ function onImpersonate($argv) { if (!is_numeric($userId)) { $res = $sql->select("id") ->from("User") - ->where(new Compare("name", $userId)) + ->whereEq("name", $userId) ->execute(); if ($res === false) { _exit("SQL error: " . $sql->getLastError());