manage: events and channels.

This commit is contained in:
Darshan 2025-05-07 10:33:54 +05:30
parent 9a45a0fc7b
commit ee117b816a
3 changed files with 14 additions and 28 deletions

View file

@ -483,26 +483,10 @@ App::init()
/* /*
* Background Jobs * Background Jobs
*/ */
$events = $route->getLabel('event', '');
$queueForEvents $queueForEvents
->setUser($user) ->setEvent($route->getLabel('event', ''))
->setEvent($events) ->setProject($project)
->setProject($project); ->setUser($user);
if (str_contains($events, '.tables.')) {
$requestFormat = $request->getHeader('x-appwrite-response-format', System::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', ''));
if ($requestFormat && version_compare($requestFormat, '1.7.0', '<')) {
$map = [
'rows' => 'documents',
'tables' => 'collections',
'columns' => 'attributes',
];
$compatibleEvents = str_replace(array_keys($map), array_values($map), $events);
// override the events
$queueForEvents->setEvent($compatibleEvents);
}
}
$queueForAudits $queueForAudits
->setMode($mode) ->setMode($mode)

View file

@ -76,16 +76,18 @@ class Realtime extends Event
$payload = new Document($this->getPayload()); $payload = new Document($this->getPayload());
$db = $this->getContext('database'); $db = $this->getContext('database');
$table = $this->getContext('table');
$bucket = $this->getContext('bucket'); $bucket = $this->getContext('bucket');
// can be Tables API or Collections API, generated channels include both!
$tableOrCollection = $this->getContext('table') ?? $this->getContext('collection');
$target = RealtimeAdapter::fromPayload( $target = RealtimeAdapter::fromPayload(
// Pass first, most verbose event pattern // Pass first, most verbose event pattern
event: $allEvents[0], event: $allEvents[0],
payload: $payload, payload: $payload,
project: $this->getProject(), project: $this->getProject(),
database: $db, database: $db,
table: $table, table: $tableOrCollection,
bucket: $bucket, bucket: $bucket,
); );

View file

@ -303,23 +303,23 @@ class Realtime extends Adapter
$channels[] = 'projects.' . $project->getId(); $channels[] = 'projects.' . $project->getId();
$projectId = 'console'; $projectId = 'console';
$roles = [Role::team($project->getAttribute('teamId'))->toString()]; $roles = [Role::team($project->getAttribute('teamId'))->toString()];
} elseif (($parts[4] ?? '') === 'rows') { } elseif (($parts[4] ?? '') === 'rows' || ($parts[4] ?? '') === 'documents') {
if ($database->isEmpty()) { if ($database->isEmpty()) {
throw new \Exception('Database needs to be passed to Realtime for Row events in the Database.'); throw new \Exception('Database needs to be passed to Realtime for Document/Row events in the Database.');
} }
if ($table->isEmpty()) { if ($table->isEmpty()) {
throw new \Exception('Table needs to be passed to Realtime for Row events in the Database.'); throw new \Exception('Collection or the Table needs to be passed to Realtime for Document/Row events in the Database.');
} }
// 1.7.x // 1.7.x - Tables API
$channels[] = 'rows'; $channels[] = 'rows';
$channels[] = 'databases.' . $database->getId() . '.tables.' . $payload->getAttribute('$tableId') . '.rows'; $channels[] = 'databases.' . $database->getId() . '.tables.' . $payload->getAttribute('$tableId') . '.rows';
$channels[] = 'databases.' . $database->getId() . '.tables.' . $payload->getAttribute('$tableId') . '.rows.' . $payload->getId(); $channels[] = 'databases.' . $database->getId() . '.tables.' . $payload->getAttribute('$tableId') . '.rows.' . $payload->getId();
// 1.6.x // 1.6.x - Collections API
$channels[] = 'documents'; $channels[] = 'documents';
$channels[] = 'databases.' . $database->getId() . '.collections.' . $payload->getAttribute('$tableId') . '.documents'; $channels[] = 'databases.' . $database->getId() . '.collections.' . $payload->getAttribute('$collectionId') . '.documents';
$channels[] = 'databases.' . $database->getId() . '.collections.' . $payload->getAttribute('$tableId') . '.documents.' . $payload->getId(); $channels[] = 'databases.' . $database->getId() . '.collections.' . $payload->getAttribute('$collectionId') . '.documents.' . $payload->getId();
$roles = $table->getAttribute('documentSecurity', false) $roles = $table->getAttribute('documentSecurity', false)
? \array_merge($table->getRead(), $payload->getRead()) ? \array_merge($table->getRead(), $payload->getRead())