| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551 |
- <?php
- /*
- * File: Query.php
- * Category: -
- * Author: M. Goldenbaum
- * Created: 21.07.18 18:54
- * Updated: -
- *
- * Description:
- * -
- */
- namespace Webklex\PHPIMAP\Query;
- use Closure;
- use Illuminate\Support\Str;
- use Webklex\PHPIMAP\Exceptions\InvalidWhereQueryCriteriaException;
- use Webklex\PHPIMAP\Exceptions\MethodNotFoundException;
- use Webklex\PHPIMAP\Exceptions\MessageSearchValidationException;
- /**
- * Class WhereQuery
- *
- * @package Webklex\PHPIMAP\Query
- *
- * @method WhereQuery all()
- * @method WhereQuery answered()
- * @method WhereQuery deleted()
- * @method WhereQuery new()
- * @method WhereQuery old()
- * @method WhereQuery recent()
- * @method WhereQuery seen()
- * @method WhereQuery unanswered()
- * @method WhereQuery undeleted()
- * @method WhereQuery unflagged()
- * @method WhereQuery unseen()
- * @method WhereQuery not()
- * @method WhereQuery unkeyword($value)
- * @method WhereQuery to($value)
- * @method WhereQuery text($value)
- * @method WhereQuery subject($value)
- * @method WhereQuery since($date)
- * @method WhereQuery on($date)
- * @method WhereQuery keyword($value)
- * @method WhereQuery from($value)
- * @method WhereQuery flagged()
- * @method WhereQuery cc($value)
- * @method WhereQuery body($value)
- * @method WhereQuery before($date)
- * @method WhereQuery bcc($value)
- * @method WhereQuery inReplyTo($value)
- * @method WhereQuery messageId($value)
- *
- * @mixin Query
- */
- class WhereQuery extends Query {
- /**
- * @var array $available_criteria
- */
- protected $available_criteria = [
- 'OR', 'AND',
- 'ALL', 'ANSWERED', 'BCC', 'BEFORE', 'BODY', 'CC', 'DELETED', 'FLAGGED', 'FROM', 'KEYWORD',
- 'NEW', 'NOT', 'OLD', 'ON', 'RECENT', 'SEEN', 'SINCE', 'SUBJECT', 'TEXT', 'TO',
- 'UNANSWERED', 'UNDELETED', 'UNFLAGGED', 'UNKEYWORD', 'UNSEEN', 'UID'
- ];
- /**
- * Magic method in order to allow alias usage of all "where" methods in an optional connection with "NOT"
- * @param string $name
- * @param array|null $arguments
- *
- * @return mixed
- * @throws InvalidWhereQueryCriteriaException
- * @throws MethodNotFoundException
- */
- public function __call($name, $arguments) {
- $that = $this;
- $name = Str::camel($name);
- if (strtolower(substr($name, 0, 3)) === 'not') {
- $that = $that->whereNot();
- $name = substr($name, 3);
- }
- if (strpos(strtolower($name), "where") === false) {
- $method = 'where' . ucfirst($name);
- } else {
- $method = lcfirst($name);
- }
- if (method_exists($this, $method) === true) {
- return call_user_func_array([$that, $method], $arguments);
- }
- throw new MethodNotFoundException("Method " . self::class . '::' . $method . '() is not supported');
- }
- /**
- * Validate a given criteria
- * @param $criteria
- *
- * @return string
- * @throws InvalidWhereQueryCriteriaException
- */
- protected function validate_criteria($criteria) {
- $criteria = strtoupper($criteria);
- if (substr($criteria, 0, 7) === "CUSTOM ") {
- return substr($criteria, 7);
- }
- if (in_array($criteria, $this->available_criteria) === false) {
- throw new InvalidWhereQueryCriteriaException();
- }
- return $criteria;
- }
- /**
- * Register search parameters
- * @param mixed $criteria
- * @param null $value
- *
- * @return $this
- * @throws InvalidWhereQueryCriteriaException
- *
- * Examples:
- * $query->from("someone@email.tld")->seen();
- * $query->whereFrom("someone@email.tld")->whereSeen();
- * $query->where([["FROM" => "someone@email.tld"], ["SEEN"]]);
- * $query->where(["FROM" => "someone@email.tld"])->where(["SEEN"]);
- * $query->where(["FROM" => "someone@email.tld", "SEEN"]);
- * $query->where("FROM", "someone@email.tld")->where("SEEN");
- */
- public function where($criteria, $value = null): WhereQuery {
- if (is_array($criteria)) {
- foreach ($criteria as $key => $value) {
- if (is_numeric($key)) {
- $this->where($value);
- }else{
- $this->where($key, $value);
- }
- }
- } else {
- $this->push_search_criteria($criteria, $value);
- }
- return $this;
- }
- /**
- * Push a given search criteria and value pair to the search query
- * @param $criteria string
- * @param $value mixed
- *
- * @throws InvalidWhereQueryCriteriaException
- */
- protected function push_search_criteria(string $criteria, $value){
- $criteria = $this->validate_criteria($criteria);
- $value = $this->parse_value($value);
- if ($value === null || $value === '') {
- $this->query->push([$criteria]);
- } else {
- $this->query->push([$criteria, $value]);
- }
- }
- /**
- * @param Closure $closure
- *
- * @return $this
- */
- public function orWhere(Closure $closure = null) {
- $this->query->push(['OR']);
- if ($closure !== null) $closure($this);
- return $this;
- }
- /**
- * @param Closure $closure
- *
- * @return $this
- */
- public function andWhere(Closure $closure = null) {
- $this->query->push(['AND']);
- if ($closure !== null) $closure($this);
- return $this;
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereAll() {
- return $this->where('ALL');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereAnswered() {
- return $this->where('ANSWERED');
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereBcc($value) {
- return $this->where('BCC', $value);
- }
- /**
- * @param mixed $value
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- * @throws MessageSearchValidationException
- */
- public function whereBefore($value) {
- $date = $this->parse_date($value);
- return $this->where('BEFORE', $date);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereBody($value) {
- return $this->where('BODY', $value);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereCc($value) {
- return $this->where('CC', $value);
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereDeleted() {
- return $this->where('DELETED');
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereFlagged($value) {
- return $this->where('FLAGGED', $value);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereFrom($value) {
- return $this->where('FROM', $value);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereKeyword($value) {
- return $this->where('KEYWORD', $value);
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereNew() {
- return $this->where('NEW');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereNot() {
- return $this->where('NOT');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereOld() {
- return $this->where('OLD');
- }
- /**
- * @param mixed $value
- *
- * @return WhereQuery
- * @throws MessageSearchValidationException
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereOn($value) {
- $date = $this->parse_date($value);
- return $this->where('ON', $date);
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereRecent() {
- return $this->where('RECENT');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereSeen() {
- return $this->where('SEEN');
- }
- /**
- * @param mixed $value
- *
- * @return WhereQuery
- * @throws MessageSearchValidationException
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereSince($value) {
- $date = $this->parse_date($value);
- return $this->where('SINCE', $date);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereSubject($value) {
- return $this->where('SUBJECT', $value);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereText($value) {
- return $this->where('TEXT', $value);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereTo($value) {
- return $this->where('TO', $value);
- }
- /**
- * @param string $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUnkeyword($value) {
- return $this->where('UNKEYWORD', $value);
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUnanswered() {
- return $this->where('UNANSWERED');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUndeleted() {
- return $this->where('UNDELETED');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUnflagged() {
- return $this->where('UNFLAGGED');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUnseen() {
- return $this->where('UNSEEN');
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereNoXSpam() {
- return $this->where("CUSTOM X-Spam-Flag NO");
- }
- /**
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereIsXSpam() {
- return $this->where("CUSTOM X-Spam-Flag YES");
- }
- /**
- * Search for a specific header value
- * @param $header
- * @param $value
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereHeader($header, $value) {
- return $this->where("CUSTOM HEADER $header $value");
- }
- /**
- * Search for a specific message id
- * @param $messageId
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereMessageId($messageId) {
- return $this->whereHeader("Message-ID", $messageId);
- }
- /**
- * Search for a specific message id
- * @param $messageId
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereInReplyTo($messageId) {
- return $this->whereHeader("In-Reply-To", $messageId);
- }
- /**
- * @param $country_code
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereLanguage($country_code) {
- return $this->where("Content-Language $country_code");
- }
- /**
- * Get message be it UID.
- *
- * @param int|string $uid
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUid($uid)
- {
- return $this->where('UID', $uid);
- }
- /**
- * Get messages by their UIDs.
- *
- * @param array<int, int> $uids
- *
- * @return WhereQuery
- * @throws InvalidWhereQueryCriteriaException
- */
- public function whereUidIn($uids)
- {
- $uids = implode(',', $uids);
- return $this->where('UID', $uids);
- }
- /**
- * Apply the callback if the given "value" is truthy.
- * copied from @url https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Traits/Conditionable.php
- *
- * @param mixed $value
- * @param callable $callback
- * @param callable|null $default
- * @return $this|mixed
- */
- public function when($value, $callback, $default = null) {
- if ($value) {
- return $callback($this, $value) ?: $this;
- } elseif ($default) {
- return $default($this, $value) ?: $this;
- }
- return $this;
- }
- /**
- * Apply the callback if the given "value" is falsy.
- * copied from @url https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Traits/Conditionable.php
- *
- * @param mixed $value
- * @param callable $callback
- * @param callable|null $default
- * @return $this|mixed
- */
- public function unless($value, $callback, $default = null) {
- if (! $value) {
- return $callback($this, $value) ?: $this;
- } elseif ($default) {
- return $default($this, $value) ?: $this;
- }
- return $this;
- }
- }
|