Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions src/MessageQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace DirectoryTree\ImapEngine;

use BackedEnum;
use DirectoryTree\ImapEngine\Collections\MessageCollection;
use DirectoryTree\ImapEngine\Collections\ResponseCollection;
use DirectoryTree\ImapEngine\Connection\ConnectionInterface;
Expand Down Expand Up @@ -211,6 +212,106 @@ public function destroy(array|int $uids, bool $expunge = false): void
}
}

/**
* {@inheritDoc}
*/
public function flag(BackedEnum|string $flag, string $operation, bool $expunge = false): int
{
$uids = $this->search()->all();

if (empty($uids)) {
return 0;
}

$this->connection()->store(
(array) Str::enums($flag),
$uids,
mode: $operation
);

if ($expunge) {
$this->folder->expunge();
}

return count($uids);
}

/**
* {@inheritDoc}
*/
public function markRead(): int
{
return $this->flag(ImapFlag::Seen, '+');
}

/**
* {@inheritDoc}
*/
public function markUnread(): int
{
return $this->flag(ImapFlag::Seen, '-');
}

/**
* {@inheritDoc}
*/
public function markFlagged(): int
{
return $this->flag(ImapFlag::Flagged, '+');
}

/**
* {@inheritDoc}
*/
public function unmarkFlagged(): int
{
return $this->flag(ImapFlag::Flagged, '-');
}

/**
* {@inheritDoc}
*/
public function delete(bool $expunge = false): int
{
return $this->flag(ImapFlag::Deleted, '+', $expunge);
}

/**
* {@inheritDoc}
*/
public function move(string $folder, bool $expunge = false): int
{
$uids = $this->search()->all();

if (empty($uids)) {
return 0;
}

$this->connection()->move($folder, $uids);

if ($expunge) {
$this->folder->expunge();
}

return count($uids);
}

/**
* {@inheritDoc}
*/
public function copy(string $folder): int
{
$uids = $this->search()->all();

if (empty($uids)) {
return 0;
}

$this->connection()->copy($folder, $uids);

return count($uids);
}

/**
* Process the collection of messages.
*/
Expand Down
58 changes: 58 additions & 0 deletions src/MessageQueryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace DirectoryTree\ImapEngine;

use BackedEnum;
use DirectoryTree\ImapEngine\Collections\MessageCollection;
use DirectoryTree\ImapEngine\Enums\ImapFetchIdentifier;
use DirectoryTree\ImapEngine\Pagination\LengthAwarePaginator;
Expand Down Expand Up @@ -205,4 +206,61 @@ public function find(int $id, ImapFetchIdentifier $identifier = ImapFetchIdentif
* Destroy the given messages.
*/
public function destroy(array|int $uids, bool $expunge = false): void;

/**
* Add or remove a flag from all messages matching the current query.
*
* @param string $operation '+'|'-'
* @return int The number of messages affected.
*/
public function flag(BackedEnum|string $flag, string $operation, bool $expunge = false): int;

/**
* Mark all messages matching the current query as read.
*
* @return int The number of messages affected.
*/
public function markRead(): int;

/**
* Mark all messages matching the current query as unread.
*
* @return int The number of messages affected.
*/
public function markUnread(): int;

/**
* Mark all messages matching the current query as flagged.
*
* @return int The number of messages affected.
*/
public function markFlagged(): int;

/**
* Unmark all messages matching the current query as flagged.
*
* @return int The number of messages affected.
*/
public function unmarkFlagged(): int;

/**
* Delete all messages matching the current query.
*
* @return int The number of messages affected.
*/
public function delete(bool $expunge = false): int;

/**
* Move all messages matching the current query to the given folder.
*
* @return int The number of messages affected.
*/
public function move(string $folder, bool $expunge = false): int;

/**
* Copy all messages matching the current query to the given folder.
*
* @return int The number of messages affected.
*/
public function copy(string $folder): int;
}
69 changes: 69 additions & 0 deletions src/Testing/FakeMessageQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace DirectoryTree\ImapEngine\Testing;

use BackedEnum;
use DirectoryTree\ImapEngine\Collections\MessageCollection;
use DirectoryTree\ImapEngine\Connection\ImapQueryBuilder;
use DirectoryTree\ImapEngine\Enums\ImapFetchIdentifier;
Expand Down Expand Up @@ -154,4 +155,72 @@ public function destroy(array|int $uids, bool $expunge = false): void
$messages->values()->all()
);
}

/**
* {@inheritDoc}
*/
public function flag(BackedEnum|string $flag, string $operation, bool $expunge = false): int
{
return count($this->folder->getMessages());
}

/**
* {@inheritDoc}
*/
public function markRead(): int
{
return count($this->folder->getMessages());
}

/**
* {@inheritDoc}
*/
public function markUnread(): int
{
return count($this->folder->getMessages());
}

/**
* {@inheritDoc}
*/
public function markFlagged(): int
{
return count($this->folder->getMessages());
}

/**
* {@inheritDoc}
*/
public function unmarkFlagged(): int
{
return count($this->folder->getMessages());
}

/**
* {@inheritDoc}
*/
public function delete(bool $expunge = false): int
{
$count = count($this->folder->getMessages());

$this->folder->setMessages([]);

return $count;
}

/**
* {@inheritDoc}
*/
public function move(string $folder, bool $expunge = false): int
{
return count($this->folder->getMessages());
}

/**
* {@inheritDoc}
*/
public function copy(string $folder): int
{
return count($this->folder->getMessages());
}
}
Loading