From 55dcd8a3f174813853bc3d4ac7feb595c0f8750d Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Wed, 20 May 2026 23:51:40 -0400 Subject: [PATCH] feat: entity patch Signed-off-by: Sebastian Krupinski --- lib/Providers/Service.php | 13 ++++++++++++- lib/Service/Remote/RemoteMailService.php | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/Providers/Service.php b/lib/Providers/Service.php index f916de3..43252e5 100644 --- a/lib/Providers/Service.php +++ b/lib/Providers/Service.php @@ -91,6 +91,7 @@ class Service implements ServiceBaseInterface, ServiceMutableInterface, ServiceC self::CAPABILITY_ENTITY_FETCH => true, self::CAPABILITY_ENTITY_CREATE => false, self::CAPABILITY_ENTITY_MODIFY => false, + self::CAPABILITY_ENTITY_PATCH => true, self::CAPABILITY_ENTITY_DELETE => true, self::CAPABILITY_ENTITY_MOVE => true, self::CAPABILITY_ENTITY_COPY => false, @@ -631,8 +632,18 @@ class Service implements ServiceBaseInterface, ServiceMutableInterface, ServiceC foreach ($targets as $targetCollection => $targetIdentifiers) { $uids = array_keys($targetIdentifiers); + $flagsAdd = []; + $flagsRemove = []; - $mutations = $this->mailService->entityPatch($targetCollection, $properties, ...$uids); + foreach ($properties->getFlags() as $flag => $value) { + if ($value === true) { + $flagsAdd[] = $flag; + } elseif ($value === false) { + $flagsRemove[] = $flag; + } + } + + $mutations = $this->mailService->entityPatch($targetCollection, $flagsAdd, $flagsRemove, ...$uids); foreach ($uids as $uid) { $list[(string)$targetIdentifiers[$uid]] = ['disposition' => 'patched']; diff --git a/lib/Service/Remote/RemoteMailService.php b/lib/Service/Remote/RemoteMailService.php index c1bdc5e..09b2e82 100644 --- a/lib/Service/Remote/RemoteMailService.php +++ b/lib/Service/Remote/RemoteMailService.php @@ -353,6 +353,9 @@ class RemoteMailService $this->client->perform(new SelectCommand($collection, false)); + $flagsToAdd = $this->normalizeFlags($flagsToAdd); + $flagsToRemove = $this->normalizeFlags($flagsToRemove); + if (!empty($flagsToAdd)) { $this->client->perform(new StoreCommand( FetchTarget::uid(SequenceSet::items(...array_values($uids))), @@ -869,4 +872,23 @@ class RemoteMailService return CollectionRoles::None->value; } + + private function normalizeFlags(array $flags): array + { + $map = [ + 'read' => '\\Seen', + 'answered' => '\\Answered', + 'flagged' => '\\Flagged', + 'deleted' => '\\Deleted', + 'draft' => '\\Draft', + ]; + $normalized = []; + foreach ($flags as $flag) { + $flag = strtolower(trim($flag)); + if (isset($map[$flag])) { + $normalized[] = $map[$flag]; + } + } + return $normalized; + } }