From 32dc870eafbed2a3c2f5341cf4c02a17cfe35852 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Thu, 30 Apr 2026 15:56:31 +0530 Subject: [PATCH] Refactor presence API functions and update expiry test to improve clarity and maintainability. Renamed 'triggerPresenceEvent' to 'getQueueForEventsForProject' and adjusted expiry handling in tests for better validation. --- app/realtime.php | 12 ++++++++++-- composer.lock | 12 ++++++------ src/Appwrite/Databases/PresenceState.php | 9 +-------- tests/e2e/Services/Presence/PresenceExpiryTest.php | 10 ++++++---- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/realtime.php b/app/realtime.php index 47c07dfd24..664ed738d8 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -313,7 +313,7 @@ if (!function_exists('triggerPresenceUsage')) { } } -if (!function_exists('triggerPresenceEvent')) { +if (!function_exists('getQueueForEventsForProject')) { function getQueueForEventsForProject(Document $project, User $user): QueueEvent { global $register; @@ -330,7 +330,9 @@ if (!function_exists('triggerPresenceEvent')) { return $queueForEvents; } +} +if (!function_exists('triggerPresenceEvent')) { function triggerPresenceEvent( Server $server, Realtime $realtime, @@ -344,13 +346,16 @@ if (!function_exists('triggerPresenceEvent')) { } try { + global $container; $queueForEvents = getQueueForEventsForProject($project, $user); $queueForEvents ->setEvent($eventName) ->setParam('presenceId', $presence->getId()) ->setPayload($presence->getArrayCopy()); - (new QueueRealtime()) + /** @var QueueRealtime $queueForRealtime */ + $queueForRealtime = $container->get('queueForRealtime'); + $queueForRealtime ->setProject($project) ->setUser($user) ->from($queueForEvents) @@ -399,6 +404,9 @@ global $container; $container->set('pools', function ($register) { return $register->get('pools'); }, ['register']); +$container->set('queueForRealtime', function () { + return new QueueRealtime(); +}, []); $realtime = getRealtime(); $presenceState = new PresenceState(); diff --git a/composer.lock b/composer.lock index 2cf57b95a3..5f85164618 100644 --- a/composer.lock +++ b/composer.lock @@ -3850,16 +3850,16 @@ }, { "name": "utopia-php/database", - "version": "5.3.22", + "version": "5.4.2", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "d765945da6b3141852014b2f96ecf1fe7e3d6ba7" + "reference": "a1bb3e2a4fba13032ea625b21a21039c43cffeda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/d765945da6b3141852014b2f96ecf1fe7e3d6ba7", - "reference": "d765945da6b3141852014b2f96ecf1fe7e3d6ba7", + "url": "https://api.github.com/repos/utopia-php/database/zipball/a1bb3e2a4fba13032ea625b21a21039c43cffeda", + "reference": "a1bb3e2a4fba13032ea625b21a21039c43cffeda", "shasum": "" }, "require": { @@ -3903,9 +3903,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/5.3.22" + "source": "https://github.com/utopia-php/database/tree/5.4.2" }, - "time": "2026-04-20T07:12:46+00:00" + "time": "2026-04-30T09:59:57+00:00" }, { "name": "utopia-php/detector", diff --git a/src/Appwrite/Databases/PresenceState.php b/src/Appwrite/Databases/PresenceState.php index 6625e709fb..dad34b2e12 100644 --- a/src/Appwrite/Databases/PresenceState.php +++ b/src/Appwrite/Databases/PresenceState.php @@ -14,7 +14,6 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; -use Utopia\System\System; class PresenceState { @@ -66,7 +65,7 @@ class PresenceState $presenceCreated = false; try { - if ($this->getSupportForUniqueIndexBasedUpsert()) { + if ($dbForProject->getAdapter()->getSupportForUpsertOnUniqueIndex()) { $presenceCreated = $dbForProject->findOne('presenceLogs', [Query::equal('userId', [$userId])])->isEmpty(); $presence = $dbForProject->upsertDocument('presenceLogs', $presenceDocument); } else { @@ -127,12 +126,6 @@ class PresenceState }); } - private function getSupportForUniqueIndexBasedUpsert(): bool - { - $adapter = \strtolower(System::getEnv('_APP_DB_ADAPTER', 'mariadb')); - return !\in_array($adapter, ['mongodb', 'postgres', 'postgresql'], true); - } - private function assertPermissionsAgainstAuthorization(array $permissions, Authorization $authorization): void { foreach (Database::PERMISSIONS as $type) { diff --git a/tests/e2e/Services/Presence/PresenceExpiryTest.php b/tests/e2e/Services/Presence/PresenceExpiryTest.php index e16b9826e1..ecbd51e147 100644 --- a/tests/e2e/Services/Presence/PresenceExpiryTest.php +++ b/tests/e2e/Services/Presence/PresenceExpiryTest.php @@ -37,8 +37,8 @@ class PresenceExpiryTest extends Scope { $projectId = $this->getProject()['$id']; $userId = $this->getUser()['$id']; - // Must match the format used by the maintenance worker query. - $expiredAt = DateTime::format((new \DateTime())->modify('-120 seconds')); + // Set a near-future expiry to satisfy validation, then wait until it is in the past. + $expiresAt = DateTime::format((new \DateTime())->modify('+2 seconds')); $createServer = $this->client->call( Client::METHOD_PUT, @@ -68,16 +68,18 @@ class PresenceExpiryTest extends Scope ], [ 'userId' => $userId, - 'expiresAt' => $expiredAt, + 'expiresAt' => $expiresAt, ] ); $this->assertEquals(200, $expireServer['headers']['status-code']); $this->assertEquals( - (new \DateTime($expiredAt))->getTimestamp(), + (new \DateTime($expiresAt))->getTimestamp(), (new \DateTime($expireServer['body']['expiresAt']))->getTimestamp() ); + \sleep(3); + $stdout = ''; $stderr = ''; $code = Console::execute('docker exec appwrite maintenance --type=trigger', '', $stdout, $stderr);