remove Realtime event class
This commit is contained in:
parent
ef919c0395
commit
eaa3644f0f
10 changed files with 231 additions and 367 deletions
|
@ -1,7 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Appwrite\Auth\Auth;
|
use Appwrite\Auth\Auth;
|
||||||
|
use Appwrite\Database\Document;
|
||||||
use Appwrite\Database\Validator\Authorization;
|
use Appwrite\Database\Validator\Authorization;
|
||||||
|
use Appwrite\Messaging\Adapter\Realtime;
|
||||||
use Utopia\App;
|
use Utopia\App;
|
||||||
use Utopia\Exception;
|
use Utopia\Exception;
|
||||||
use Utopia\Abuse\Abuse;
|
use Utopia\Abuse\Abuse;
|
||||||
|
@ -166,7 +168,7 @@ App::init(function ($utopia, $request, $response, $project, $user) {
|
||||||
|
|
||||||
}, ['utopia', 'request', 'response', 'project', 'user'], 'auth');
|
}, ['utopia', 'request', 'response', 'project', 'user'], 'auth');
|
||||||
|
|
||||||
App::shutdown(function ($utopia, $request, $response, $project, $events, $audits, $usage, $deletes, $realtime, $mode) {
|
App::shutdown(function ($utopia, $request, $response, $project, $events, $audits, $usage, $deletes, $mode) {
|
||||||
/** @var Utopia\App $utopia */
|
/** @var Utopia\App $utopia */
|
||||||
/** @var Utopia\Swoole\Request $request */
|
/** @var Utopia\Swoole\Request $request */
|
||||||
/** @var Appwrite\Utopia\Response $response */
|
/** @var Appwrite\Utopia\Response $response */
|
||||||
|
@ -175,8 +177,6 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits
|
||||||
/** @var Appwrite\Event\Event $audits */
|
/** @var Appwrite\Event\Event $audits */
|
||||||
/** @var Appwrite\Event\Event $usage */
|
/** @var Appwrite\Event\Event $usage */
|
||||||
/** @var Appwrite\Event\Event $deletes */
|
/** @var Appwrite\Event\Event $deletes */
|
||||||
/** @var Appwrite\Event\Realtime $realtime */
|
|
||||||
/** @var Appwrite\Event\Event $functions */
|
|
||||||
/** @var bool $mode */
|
/** @var bool $mode */
|
||||||
|
|
||||||
if (!empty($events->getParam('event'))) {
|
if (!empty($events->getParam('event'))) {
|
||||||
|
@ -198,12 +198,20 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits
|
||||||
->trigger();
|
->trigger();
|
||||||
|
|
||||||
if ($project->getId() !== 'console') {
|
if ($project->getId() !== 'console') {
|
||||||
$realtime
|
$payload = new Document($response->getPayload());
|
||||||
->setEvent($events->getParam('event'))
|
$target = Realtime::fromPayload($events->getParam('event'), $payload);
|
||||||
->setUserId($events->getParam('userId'))
|
|
||||||
->setProject($project->getId())
|
Realtime::send(
|
||||||
->setPayload($response->getPayload())
|
$project->getId(),
|
||||||
->trigger();
|
$response->getPayload(),
|
||||||
|
$events->getParam('event'),
|
||||||
|
$target['channels'],
|
||||||
|
$target['permissions'],
|
||||||
|
[
|
||||||
|
'permissionsChanged' => $target['permissionsChanged'],
|
||||||
|
'userId' => $events->getParam('userId')
|
||||||
|
]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,4 +236,4 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
}, ['utopia', 'request', 'response', 'project', 'events', 'audits', 'usage', 'deletes', 'realtime', 'mode'], 'api');
|
}, ['utopia', 'request', 'response', 'project', 'events', 'audits', 'usage', 'deletes', 'mode'], 'api');
|
||||||
|
|
|
@ -341,10 +341,6 @@ App::setResource('events', function($register) {
|
||||||
return new Event('', '');
|
return new Event('', '');
|
||||||
}, ['register']);
|
}, ['register']);
|
||||||
|
|
||||||
App::setResource('realtime', function($register) {
|
|
||||||
return new Realtime('', '', []);
|
|
||||||
}, ['register']);
|
|
||||||
|
|
||||||
App::setResource('audits', function($register) {
|
App::setResource('audits', function($register) {
|
||||||
return new Event(Event::AUDITS_QUEUE_NAME, Event::AUDITS_CLASS_NAME);
|
return new Event(Event::AUDITS_QUEUE_NAME, Event::AUDITS_CLASS_NAME);
|
||||||
}, ['register']);
|
}, ['register']);
|
||||||
|
|
|
@ -5,7 +5,6 @@ use Appwrite\Database\Adapter\Redis as RedisAdapter;
|
||||||
use Appwrite\Database\Adapter\MySQL as MySQLAdapter;
|
use Appwrite\Database\Adapter\MySQL as MySQLAdapter;
|
||||||
use Appwrite\Database\Database;
|
use Appwrite\Database\Database;
|
||||||
use Appwrite\Event\Event;
|
use Appwrite\Event\Event;
|
||||||
use Appwrite\Event\Realtime as RealtimeEvent;
|
|
||||||
use Appwrite\Messaging\Adapter\Realtime;
|
use Appwrite\Messaging\Adapter\Realtime;
|
||||||
use Appwrite\Network\Validator\Origin;
|
use Appwrite\Network\Validator\Origin;
|
||||||
use Swoole\Http\Request as SwooleRequest;
|
use Swoole\Http\Request as SwooleRequest;
|
||||||
|
@ -267,7 +266,7 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server,
|
||||||
...Auth::getRoles($user)
|
...Auth::getRoles($user)
|
||||||
];
|
];
|
||||||
|
|
||||||
$channels = RealtimeEvent::convertChannels($request->getQuery('channels', []), $user);
|
$channels = Realtime::convertChannels($request->getQuery('channels', []), $user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Channels Check
|
* Channels Check
|
||||||
|
|
|
@ -6,7 +6,7 @@ use Appwrite\Database\Adapter\MySQL as MySQLAdapter;
|
||||||
use Appwrite\Database\Adapter\Redis as RedisAdapter;
|
use Appwrite\Database\Adapter\Redis as RedisAdapter;
|
||||||
use Appwrite\Database\Validator\Authorization;
|
use Appwrite\Database\Validator\Authorization;
|
||||||
use Appwrite\Event\Event;
|
use Appwrite\Event\Event;
|
||||||
use Appwrite\Event\Realtime;
|
use Appwrite\Messaging\Adapter\Realtime;
|
||||||
use Appwrite\Resque\Worker;
|
use Appwrite\Resque\Worker;
|
||||||
use Appwrite\Utopia\Response\Model\Execution;
|
use Appwrite\Utopia\Response\Model\Execution;
|
||||||
use Cron\CronExpression;
|
use Cron\CronExpression;
|
||||||
|
@ -494,9 +494,15 @@ class FunctionsV1 extends Worker
|
||||||
|
|
||||||
$executionUpdate->trigger();
|
$executionUpdate->trigger();
|
||||||
|
|
||||||
$realtimeUpdate = new Realtime($projectId, 'functions.executions.update', $execution->getArrayCopy());
|
$target = Realtime::fromPayload('functions.executions.update', $execution);
|
||||||
|
|
||||||
$realtimeUpdate->trigger();
|
Realtime::send(
|
||||||
|
$projectId,
|
||||||
|
$execution->getArrayCopy(),
|
||||||
|
'functions.executions.update',
|
||||||
|
$target['channels'],
|
||||||
|
$target['permissions']
|
||||||
|
);
|
||||||
|
|
||||||
$usage = new Event('v1-usage', 'UsageV1');
|
$usage = new Event('v1-usage', 'UsageV1');
|
||||||
|
|
||||||
|
|
|
@ -1,264 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Event;
|
|
||||||
|
|
||||||
use Appwrite\Database\Document;
|
|
||||||
use Utopia\App;
|
|
||||||
|
|
||||||
class Realtime
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $project = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $event = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $userId = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $channels = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $permissions = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var false
|
|
||||||
*/
|
|
||||||
protected $permissionsChanged = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Document
|
|
||||||
*/
|
|
||||||
protected $payload;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event constructor.
|
|
||||||
*
|
|
||||||
* @param string $project
|
|
||||||
* @param string $event
|
|
||||||
* @param array $payload
|
|
||||||
*/
|
|
||||||
public function __construct(string $project, string $event, array $payload)
|
|
||||||
{
|
|
||||||
$this->project = $project;
|
|
||||||
$this->event = $event;
|
|
||||||
$this->payload = new Document($payload);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $project
|
|
||||||
* return $this
|
|
||||||
*/
|
|
||||||
public function setProject(string $project): self
|
|
||||||
{
|
|
||||||
$this->project = $project;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $userId
|
|
||||||
* return $this
|
|
||||||
*/
|
|
||||||
public function setUserId(string $userId): self
|
|
||||||
{
|
|
||||||
$this->userId = $userId;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getProject(): string
|
|
||||||
{
|
|
||||||
return $this->project;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $event
|
|
||||||
* return $this
|
|
||||||
*/
|
|
||||||
public function setEvent(string $event): self
|
|
||||||
{
|
|
||||||
$this->event = $event;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getEvent(): string
|
|
||||||
{
|
|
||||||
return $this->event;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $payload
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setPayload(array $payload): self
|
|
||||||
{
|
|
||||||
$this->payload = new Document($payload);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Document
|
|
||||||
*/
|
|
||||||
public function getPayload(): Document
|
|
||||||
{
|
|
||||||
return $this->payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the channels from the Query Params into an array.
|
|
||||||
* Also renames the account channel to account.USER_ID and removes all illegal account channel variations.
|
|
||||||
* @param array $channels
|
|
||||||
* @param Document $user
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public static function convertChannels(array $channels, Document $user): array
|
|
||||||
{
|
|
||||||
$channels = array_flip($channels);
|
|
||||||
|
|
||||||
foreach ($channels as $key => $value) {
|
|
||||||
switch (true) {
|
|
||||||
case strpos($key, 'account.') === 0:
|
|
||||||
unset($channels[$key]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $key === 'account':
|
|
||||||
if (!empty($user->getId())) {
|
|
||||||
$channels['account.' . $user->getId()] = $value;
|
|
||||||
}
|
|
||||||
unset($channels['account']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (\array_key_exists('account', $channels)) {
|
|
||||||
if ($user->getId()) {
|
|
||||||
$channels['account.' . $user->getId()] = $channels['account'];
|
|
||||||
}
|
|
||||||
unset($channels['account']);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $channels;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Populate channels array based on the event name and payload.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function prepareChannels(): void
|
|
||||||
{
|
|
||||||
switch (true) {
|
|
||||||
case strpos($this->event, 'account.recovery.') === 0:
|
|
||||||
case strpos($this->event, 'account.sessions.') === 0:
|
|
||||||
case strpos($this->event, 'account.verification.') === 0:
|
|
||||||
$this->channels[] = 'account.' . $this->payload->getAttribute('userId');
|
|
||||||
$this->permissions = ['user:' . $this->payload->getAttribute('userId')];
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'account.') === 0:
|
|
||||||
$this->channels[] = 'account.' . $this->payload->getId();
|
|
||||||
$this->permissions = ['user:' . $this->payload->getId()];
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'teams.memberships') === 0:
|
|
||||||
$this->permissionsChanged = in_array($this->event, ['teams.memberships.update', 'teams.memberships.delete', 'teams.memberships.update.status']);
|
|
||||||
$this->channels[] = 'memberships';
|
|
||||||
$this->channels[] = 'memberships.' . $this->payload->getId();
|
|
||||||
$this->permissions = ['team:' . $this->payload->getAttribute('teamId')];
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'teams.') === 0:
|
|
||||||
$this->permissionsChanged = $this->event === 'teams.create';
|
|
||||||
$this->channels[] = 'teams';
|
|
||||||
$this->channels[] = 'teams.' . $this->payload->getId();
|
|
||||||
$this->permissions = ['team:' . $this->payload->getId()];
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'database.collections.') === 0:
|
|
||||||
$this->channels[] = 'collections';
|
|
||||||
$this->channels[] = 'collections.' . $this->payload->getId();
|
|
||||||
$this->permissions = $this->payload->getAttribute('$permissions.read');
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'database.documents.') === 0:
|
|
||||||
$this->channels[] = 'documents';
|
|
||||||
$this->channels[] = 'collections.' . $this->payload->getAttribute('$collection') . '.documents';
|
|
||||||
$this->channels[] = 'documents.' . $this->payload->getId();
|
|
||||||
$this->permissions = $this->payload->getAttribute('$permissions.read');
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'storage.') === 0:
|
|
||||||
$this->channels[] = 'files';
|
|
||||||
$this->channels[] = 'files.' . $this->payload->getId();
|
|
||||||
$this->permissions = $this->payload->getAttribute('$permissions.read');
|
|
||||||
|
|
||||||
break;
|
|
||||||
case strpos($this->event, 'functions.executions.') === 0:
|
|
||||||
if (!empty($this->payload->getAttribute('$permissions.read'))) {
|
|
||||||
$this->channels[] = 'executions';
|
|
||||||
$this->channels[] = 'executions.' . $this->payload->getId();
|
|
||||||
$this->channels[] = 'functions.' . $this->payload->getAttribute('functionId');
|
|
||||||
$this->permissions = $this->payload->getAttribute('$permissions.read');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute Event.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function trigger(): void
|
|
||||||
{
|
|
||||||
$this->prepareChannels();
|
|
||||||
if (empty($this->channels)) return;
|
|
||||||
|
|
||||||
$redis = new \Redis();
|
|
||||||
$redis->connect(App::getEnv('_APP_REDIS_HOST', ''), App::getEnv('_APP_REDIS_PORT', ''));
|
|
||||||
$redis->publish('realtime', json_encode([
|
|
||||||
'project' => $this->project,
|
|
||||||
'permissions' => $this->permissions,
|
|
||||||
'permissionsChanged' => $this->permissionsChanged,
|
|
||||||
'userId' => $this->userId,
|
|
||||||
'data' => [
|
|
||||||
'event' => $this->event,
|
|
||||||
'channels' => $this->channels,
|
|
||||||
'timestamp' => time(),
|
|
||||||
'payload' => $this->payload->getArrayCopy()
|
|
||||||
]
|
|
||||||
]));
|
|
||||||
|
|
||||||
$this->reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets this event and unpopulates all data.
|
|
||||||
*
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function reset(): self
|
|
||||||
{
|
|
||||||
$this->event = '';
|
|
||||||
$this->payload = $this->channels = [];
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -6,5 +6,5 @@ abstract class Adapter
|
||||||
{
|
{
|
||||||
public abstract function subscribe(string $project, mixed $identifier, array $roles, array $channels): void;
|
public abstract function subscribe(string $project, mixed $identifier, array $roles, array $channels): void;
|
||||||
public abstract function unsubscribe(mixed $identifier): void;
|
public abstract function unsubscribe(mixed $identifier): void;
|
||||||
public abstract function send(string $projectId, string $event, array $payload): void;
|
public static abstract function send(string $projectId, array $payload, string $event, array $channels, array $permissions, array $options): void;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
|
|
||||||
namespace Appwrite\Messaging\Adapter;
|
namespace Appwrite\Messaging\Adapter;
|
||||||
|
|
||||||
use Appwrite\Event\Realtime as EventRealtime;
|
use Appwrite\Database\Document;
|
||||||
use Appwrite\Messaging\Adapter;
|
use Appwrite\Messaging\Adapter;
|
||||||
|
use Utopia\App;
|
||||||
|
|
||||||
class Realtime extends Adapter
|
class Realtime extends Adapter
|
||||||
{
|
{
|
||||||
|
@ -116,15 +117,35 @@ class Realtime extends Adapter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends an event to the Realtime Server.
|
* Sends an event to the Realtime Server.
|
||||||
* @param string $projectId
|
* @param string $project
|
||||||
* @param string $event
|
|
||||||
* @param array $payload
|
* @param array $payload
|
||||||
|
* @param string $event
|
||||||
|
* @param array $channels
|
||||||
|
* @param array $permissions
|
||||||
|
* @param array $options
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function send(string $projectId, string $event, array $payload): void
|
public static function send(string $project, array $payload, string $event, array $channels, array $permissions, array $options = []): void
|
||||||
{
|
{
|
||||||
$realtime = new EventRealtime($projectId, $event, $payload);
|
if (empty($channels) || empty($permissions) || empty($project)) return;
|
||||||
$realtime->trigger();
|
|
||||||
|
$permissionsChanged = array_key_exists('permissionsChanged', $options) && $options['permissionsChanged'];
|
||||||
|
$userId = array_key_exists('userId', $options) ? $options['userId'] : null;
|
||||||
|
|
||||||
|
$redis = new \Redis();
|
||||||
|
$redis->connect(App::getEnv('_APP_REDIS_HOST', ''), App::getEnv('_APP_REDIS_PORT', ''));
|
||||||
|
$redis->publish('realtime', json_encode([
|
||||||
|
'project' => $project,
|
||||||
|
'permissions' => $permissions,
|
||||||
|
'permissionsChanged' => $permissionsChanged,
|
||||||
|
'userId' => $userId,
|
||||||
|
'data' => [
|
||||||
|
'event' => $event,
|
||||||
|
'channels' => $channels,
|
||||||
|
'timestamp' => time(),
|
||||||
|
'payload' => $payload
|
||||||
|
]
|
||||||
|
]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -161,4 +182,114 @@ class Realtime extends Adapter
|
||||||
|
|
||||||
return array_keys($receivers);
|
return array_keys($receivers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the channels from the Query Params into an array.
|
||||||
|
* Also renames the account channel to account.USER_ID and removes all illegal account channel variations.
|
||||||
|
* @param array $channels
|
||||||
|
* @param Document $user
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function convertChannels(array $channels, Document $user): array
|
||||||
|
{
|
||||||
|
$channels = array_flip($channels);
|
||||||
|
|
||||||
|
foreach ($channels as $key => $value) {
|
||||||
|
switch (true) {
|
||||||
|
case strpos($key, 'account.') === 0:
|
||||||
|
unset($channels[$key]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case $key === 'account':
|
||||||
|
if (!empty($user->getId())) {
|
||||||
|
$channels['account.' . $user->getId()] = $value;
|
||||||
|
}
|
||||||
|
unset($channels['account']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\array_key_exists('account', $channels)) {
|
||||||
|
if ($user->getId()) {
|
||||||
|
$channels['account.' . $user->getId()] = $channels['account'];
|
||||||
|
}
|
||||||
|
unset($channels['account']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create channels array based on the event name and payload.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function fromPayload(string $event, Document $payload): array
|
||||||
|
{
|
||||||
|
$channels = [];
|
||||||
|
$permissions = [];
|
||||||
|
$permissionsChanged = false;
|
||||||
|
|
||||||
|
switch (true) {
|
||||||
|
case strpos($event, 'account.recovery.') === 0:
|
||||||
|
case strpos($event, 'account.sessions.') === 0:
|
||||||
|
case strpos($event, 'account.verification.') === 0:
|
||||||
|
$channels[] = 'account.' . $payload->getAttribute('userId');
|
||||||
|
$permissions = ['user:' . $payload->getAttribute('userId')];
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'account.') === 0:
|
||||||
|
$channels[] = 'account.' . $payload->getId();
|
||||||
|
$permissions = ['user:' . $payload->getId()];
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'teams.memberships') === 0:
|
||||||
|
$permissionsChanged = in_array($event, ['teams.memberships.update', 'teams.memberships.delete', 'teams.memberships.update.status']);
|
||||||
|
$channels[] = 'memberships';
|
||||||
|
$channels[] = 'memberships.' . $payload->getId();
|
||||||
|
$permissions = ['team:' . $payload->getAttribute('teamId')];
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'teams.') === 0:
|
||||||
|
$permissionsChanged = $event === 'teams.create';
|
||||||
|
$channels[] = 'teams';
|
||||||
|
$channels[] = 'teams.' . $payload->getId();
|
||||||
|
$permissions = ['team:' . $payload->getId()];
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'database.collections.') === 0:
|
||||||
|
$channels[] = 'collections';
|
||||||
|
$channels[] = 'collections.' . $payload->getId();
|
||||||
|
$permissions = $payload->getAttribute('$permissions.read');
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'database.documents.') === 0:
|
||||||
|
$channels[] = 'documents';
|
||||||
|
$channels[] = 'collections.' . $payload->getAttribute('$collection') . '.documents';
|
||||||
|
$channels[] = 'documents.' . $payload->getId();
|
||||||
|
$permissions = $payload->getAttribute('$permissions.read');
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'storage.') === 0:
|
||||||
|
$channels[] = 'files';
|
||||||
|
$channels[] = 'files.' . $payload->getId();
|
||||||
|
$permissions = $payload->getAttribute('$permissions.read');
|
||||||
|
|
||||||
|
break;
|
||||||
|
case strpos($event, 'functions.executions.') === 0:
|
||||||
|
if (!empty($payload->getAttribute('$permissions.read'))) {
|
||||||
|
$channels[] = 'executions';
|
||||||
|
$channels[] = 'executions.' . $payload->getId();
|
||||||
|
$channels[] = 'functions.' . $payload->getAttribute('functionId');
|
||||||
|
$permissions = $payload->getAttribute('$permissions.read');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'channels' => $channels,
|
||||||
|
'permissions' => $permissions,
|
||||||
|
'permissionsChanged' => $permissionsChanged
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Tests;
|
|
||||||
|
|
||||||
use Appwrite\Database\Document;
|
|
||||||
use Appwrite\Event\Event;
|
|
||||||
use Appwrite\Event\Realtime;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use Utopia\App;
|
|
||||||
|
|
||||||
class RealtimeTest extends TestCase
|
|
||||||
{
|
|
||||||
public function testConvertChannelsGuest()
|
|
||||||
{
|
|
||||||
$user = new Document([
|
|
||||||
'$id' => ''
|
|
||||||
]);
|
|
||||||
$channels = [
|
|
||||||
0 => 'files',
|
|
||||||
1 => 'documents',
|
|
||||||
2 => 'documents.789',
|
|
||||||
3 => 'account',
|
|
||||||
4 => 'account.456'
|
|
||||||
];
|
|
||||||
|
|
||||||
$channels = Realtime::convertChannels($channels, $user);
|
|
||||||
$this->assertCount(3, $channels);
|
|
||||||
$this->assertArrayHasKey('files', $channels);
|
|
||||||
$this->assertArrayHasKey('documents', $channels);
|
|
||||||
$this->assertArrayHasKey('documents.789', $channels);
|
|
||||||
$this->assertArrayNotHasKey('account', $channels);
|
|
||||||
$this->assertArrayNotHasKey('account.456', $channels);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testConvertChannelsUser()
|
|
||||||
{
|
|
||||||
$user = new Document([
|
|
||||||
'$id' => '123',
|
|
||||||
'memberships' => [
|
|
||||||
[
|
|
||||||
'teamId' => 'abc',
|
|
||||||
'roles' => [
|
|
||||||
'administrator',
|
|
||||||
'moderator'
|
|
||||||
]
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'teamId' => 'def',
|
|
||||||
'roles' => [
|
|
||||||
'guest'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
$channels = [
|
|
||||||
0 => 'files',
|
|
||||||
1 => 'documents',
|
|
||||||
2 => 'documents.789',
|
|
||||||
3 => 'account',
|
|
||||||
4 => 'account.456'
|
|
||||||
];
|
|
||||||
|
|
||||||
$channels = Realtime::convertChannels($channels, $user);
|
|
||||||
|
|
||||||
$this->assertCount(4, $channels);
|
|
||||||
$this->assertArrayHasKey('files', $channels);
|
|
||||||
$this->assertArrayHasKey('documents', $channels);
|
|
||||||
$this->assertArrayHasKey('documents.789', $channels);
|
|
||||||
$this->assertArrayHasKey('account.123', $channels);
|
|
||||||
$this->assertArrayNotHasKey('account', $channels);
|
|
||||||
$this->assertArrayNotHasKey('account.456', $channels);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,8 +4,6 @@ namespace Appwrite\Tests;
|
||||||
|
|
||||||
use Appwrite\Auth\Auth;
|
use Appwrite\Auth\Auth;
|
||||||
use Appwrite\Database\Document;
|
use Appwrite\Database\Document;
|
||||||
use Appwrite\Event\Realtime as EventRealtime;
|
|
||||||
use Appwrite\Messaging;
|
|
||||||
use Appwrite\Messaging\Adapter\Realtime;
|
use Appwrite\Messaging\Adapter\Realtime;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
@ -67,7 +65,7 @@ class MessagingChannelsTest extends TestCase
|
||||||
...Auth::getRoles($user)
|
...Auth::getRoles($user)
|
||||||
];
|
];
|
||||||
|
|
||||||
$parsedChannels = EventRealtime::convertChannels([0 => $channel], $user);
|
$parsedChannels = Realtime::convertChannels([0 => $channel], $user);
|
||||||
|
|
||||||
$this->realtime->subscribe(
|
$this->realtime->subscribe(
|
||||||
'1',
|
'1',
|
||||||
|
@ -94,7 +92,7 @@ class MessagingChannelsTest extends TestCase
|
||||||
...Auth::getRoles($user)
|
...Auth::getRoles($user)
|
||||||
];
|
];
|
||||||
|
|
||||||
$parsedChannels = EventRealtime::convertChannels([0 => $channel], $user);
|
$parsedChannels = Realtime::convertChannels([0 => $channel], $user);
|
||||||
|
|
||||||
$this->realtime->subscribe(
|
$this->realtime->subscribe(
|
||||||
'1',
|
'1',
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Appwrite\Tests;
|
namespace Appwrite\Tests;
|
||||||
|
|
||||||
|
use Appwrite\Database\Document;
|
||||||
use Appwrite\Messaging\Adapter\Realtime;
|
use Appwrite\Messaging\Adapter\Realtime;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
@ -132,4 +133,66 @@ class MessagingTest extends TestCase
|
||||||
$this->assertEmpty($realtime->connections);
|
$this->assertEmpty($realtime->connections);
|
||||||
$this->assertEmpty($realtime->subscriptions);
|
$this->assertEmpty($realtime->subscriptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testConvertChannelsGuest()
|
||||||
|
{
|
||||||
|
$user = new Document([
|
||||||
|
'$id' => ''
|
||||||
|
]);
|
||||||
|
|
||||||
|
$channels = [
|
||||||
|
0 => 'files',
|
||||||
|
1 => 'documents',
|
||||||
|
2 => 'documents.789',
|
||||||
|
3 => 'account',
|
||||||
|
4 => 'account.456'
|
||||||
|
];
|
||||||
|
|
||||||
|
$channels = Realtime::convertChannels($channels, $user);
|
||||||
|
$this->assertCount(3, $channels);
|
||||||
|
$this->assertArrayHasKey('files', $channels);
|
||||||
|
$this->assertArrayHasKey('documents', $channels);
|
||||||
|
$this->assertArrayHasKey('documents.789', $channels);
|
||||||
|
$this->assertArrayNotHasKey('account', $channels);
|
||||||
|
$this->assertArrayNotHasKey('account.456', $channels);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConvertChannelsUser()
|
||||||
|
{
|
||||||
|
$user = new Document([
|
||||||
|
'$id' => '123',
|
||||||
|
'memberships' => [
|
||||||
|
[
|
||||||
|
'teamId' => 'abc',
|
||||||
|
'roles' => [
|
||||||
|
'administrator',
|
||||||
|
'moderator'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'teamId' => 'def',
|
||||||
|
'roles' => [
|
||||||
|
'guest'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
$channels = [
|
||||||
|
0 => 'files',
|
||||||
|
1 => 'documents',
|
||||||
|
2 => 'documents.789',
|
||||||
|
3 => 'account',
|
||||||
|
4 => 'account.456'
|
||||||
|
];
|
||||||
|
|
||||||
|
$channels = Realtime::convertChannels($channels, $user);
|
||||||
|
|
||||||
|
$this->assertCount(4, $channels);
|
||||||
|
$this->assertArrayHasKey('files', $channels);
|
||||||
|
$this->assertArrayHasKey('documents', $channels);
|
||||||
|
$this->assertArrayHasKey('documents.789', $channels);
|
||||||
|
$this->assertArrayHasKey('account.123', $channels);
|
||||||
|
$this->assertArrayNotHasKey('account', $channels);
|
||||||
|
$this->assertArrayNotHasKey('account.456', $channels);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue