diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 0e4f28bd66..be6ed68e05 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -852,7 +852,7 @@ App::get('/v1/account/identities') }); App::delete('/v1/account/identities/:identityId') - ->desc('Delete Identity') + ->desc('Delete identity') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].identities.[identityId].delete') @@ -868,7 +868,8 @@ App::delete('/v1/account/identities/:identityId') ->param('identityId', '', new UID(), 'Identity ID.') ->inject('response') ->inject('dbForProject') - ->action(function (string $identityId, Response $response, Database $dbForProject) { + ->inject('queueForEvents') + ->action(function (string $identityId, Response $response, Database $dbForProject, Event $queueForEvents) { $identity = $dbForProject->getDocument('identities', $identityId); @@ -878,6 +879,11 @@ App::delete('/v1/account/identities/:identityId') $dbForProject->deleteDocument('identities', $identityId); + $queueForEvents + ->setParam('userId', $identity->getAttribute('userId')) + ->setParam('identityId', $identity->getId()) + ->setPayload($response->output($identity, Response::MODEL_IDENTITY)); + return $response->noContent(); }); diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 590058a844..38d65fba7e 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -1203,7 +1203,7 @@ App::delete('/v1/users/:userId') }); App::delete('/v1/users/identities/:identityId') - ->desc('Delete Identity') + ->desc('Delete identity') ->groups(['api', 'users']) ->label('event', 'users.[userId].identities.[identityId].delete') ->label('scope', 'users.write') @@ -1218,7 +1218,8 @@ App::delete('/v1/users/identities/:identityId') ->param('identityId', '', new UID(), 'Identity ID.') ->inject('response') ->inject('dbForProject') - ->action(function (string $identityId, Response $response, Database $dbForProject) { + ->inject('queueForEvents') + ->action(function (string $identityId, Response $response, Database $dbForProject, Event $queueForEvents) { $identity = $dbForProject->getDocument('identities', $identityId); @@ -1228,6 +1229,11 @@ App::delete('/v1/users/identities/:identityId') $dbForProject->deleteDocument('identities', $identityId); + $queueForEvents + ->setParam('userId', $identity->getAttribute('userId')) + ->setParam('identityId', $identity->getId()) + ->setPayload($response->output($identity, Response::MODEL_IDENTITY)); + return $response->noContent(); }); diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index 3ae3ca6d6d..3e227c1fc2 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -644,7 +644,7 @@ services: - _APP_DB_PASS appwrite-assistant: - image: appwrite/assistant:0.2.2 + image: appwrite/assistant:0.3.0 container_name: appwrite-assistant <<: *x-logging restart: unless-stopped diff --git a/docker-compose.yml b/docker-compose.yml index ea9b6897a5..5c645e3bcd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -705,7 +705,7 @@ services: appwrite-assistant: container_name: appwrite-assistant - image: appwrite/assistant:0.2.2 + image: appwrite/assistant:0.3.0 networks: - appwrite environment: diff --git a/src/Appwrite/Platform/Tasks/Install.php b/src/Appwrite/Platform/Tasks/Install.php index eb419ade11..c6107c6ba8 100644 --- a/src/Appwrite/Platform/Tasks/Install.php +++ b/src/Appwrite/Platform/Tasks/Install.php @@ -8,6 +8,7 @@ use Appwrite\Docker\Env; use Appwrite\Utopia\View; use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Validator\Boolean; use Utopia\Validator\Text; use Utopia\Platform\Action; @@ -24,15 +25,16 @@ class Install extends Action { $this ->desc('Install Appwrite') - ->param('httpPort', '', new Text(4), 'Server HTTP port', true) - ->param('httpsPort', '', new Text(4), 'Server HTTPS port', true) + ->param('http-port', '', new Text(4), 'Server HTTP port', true) + ->param('https-port', '', new Text(4), 'Server HTTPS port', true) ->param('organization', 'appwrite', new Text(0), 'Docker Registry organization', true) ->param('image', 'appwrite', new Text(0), 'Main appwrite docker image', true) ->param('interactive', 'Y', new Text(1), 'Run an interactive session', true) - ->callback(fn ($httpPort, $httpsPort, $organization, $image, $interactive) => $this->action($httpPort, $httpsPort, $organization, $image, $interactive)); + ->param('no-start', false, new Boolean(true), 'Run an interactive session', true) + ->callback(fn ($httpPort, $httpsPort, $organization, $image, $interactive, $noStart) => $this->action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart)); } - public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive): void + public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart): void { $config = Config::getParam('variables'); $defaultHTTPPort = '80'; @@ -220,9 +222,11 @@ class Install extends Action } } - Console::log("Running \"docker compose up -d --remove-orphans --renew-anon-volumes\""); - - $exit = Console::execute("$env docker compose --project-directory $this->path up -d --remove-orphans --renew-anon-volumes", '', $stdout, $stderr); + $exit = 0; + if (!$noStart) { + Console::log("Running \"docker compose up -d --remove-orphans --renew-anon-volumes\""); + $exit = Console::execute("$env docker compose --project-directory $this->path up -d --remove-orphans --renew-anon-volumes", '', $stdout, $stderr); + } if ($exit !== 0) { $message = 'Failed to install Appwrite dockers'; diff --git a/src/Appwrite/Platform/Tasks/Upgrade.php b/src/Appwrite/Platform/Tasks/Upgrade.php index e3f0458394..341ce42fc4 100644 --- a/src/Appwrite/Platform/Tasks/Upgrade.php +++ b/src/Appwrite/Platform/Tasks/Upgrade.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Tasks; use Utopia\CLI\Console; +use Utopia\Validator\Boolean; use Utopia\Validator\Text; class Upgrade extends Install @@ -16,15 +17,16 @@ class Upgrade extends Install { $this ->desc('Upgrade Appwrite') - ->param('httpPort', '', new Text(4), 'Server HTTP port', true) - ->param('httpsPort', '', new Text(4), 'Server HTTPS port', true) + ->param('http-port', '', new Text(4), 'Server HTTP port', true) + ->param('https-port', '', new Text(4), 'Server HTTPS port', true) ->param('organization', 'appwrite', new Text(0), 'Docker Registry organization', true) ->param('image', 'appwrite', new Text(0), 'Main appwrite docker image', true) ->param('interactive', 'Y', new Text(1), 'Run an interactive session', true) - ->callback(fn ($httpPort, $httpsPort, $organization, $image, $interactive) => $this->action($httpPort, $httpsPort, $organization, $image, $interactive)); + ->param('no-start', false, new Boolean(true), 'Run an interactive session', true) + ->callback(fn ($httpPort, $httpsPort, $organization, $image, $interactive, $noStart) => $this->action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart)); } - public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive): void + public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart): void { // Check for previous installation $data = @file_get_contents($this->path . '/docker-compose.yml'); @@ -37,6 +39,6 @@ class Upgrade extends Install Console::log(' └── docker-compose.yml'); Console::exit(1); } - parent::action($httpPort, $httpsPort, $organization, $image, $interactive); + parent::action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart); } } diff --git a/src/Appwrite/Platform/Workers/Usage.php b/src/Appwrite/Platform/Workers/Usage.php index d8da3cd165..5537fae504 100644 --- a/src/Appwrite/Platform/Workers/Usage.php +++ b/src/Appwrite/Platform/Workers/Usage.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Workers; use Exception; use Utopia\CLI\Console; use Utopia\Database\Database; +use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Platform\Action; use Utopia\Queue\Message; @@ -19,7 +20,7 @@ class Usage extends Action ]; protected const INFINITY_PERIOD = '_inf_'; - + protected const DEBUG_PROJECT_ID = 85293; public static function getName(): string { return 'usage'; @@ -50,7 +51,6 @@ class Usage extends Action public function action(Message $message, callable $getProjectDB): void { $payload = $message->getPayload() ?? []; - if (empty($payload)) { throw new Exception('Missing payload'); } @@ -70,6 +70,16 @@ class Usage extends Action getProjectDB: $getProjectDB ); } + if ($project->getInternalId() == self::DEBUG_PROJECT_ID) { + var_dump([ + 'type' => 'payload', + 'project' => $project->getInternalId(), + 'database' => $project['database'] ?? '', + $payload['metrics'] + ]); + + var_dump('=========================='); + } self::$stats[$projectId]['project'] = $project; foreach ($payload['metrics'] ?? [] as $metric) { diff --git a/src/Appwrite/Platform/Workers/UsageHook.php b/src/Appwrite/Platform/Workers/UsageHook.php index 3125a0d93d..68e6a3fede 100644 --- a/src/Appwrite/Platform/Workers/UsageHook.php +++ b/src/Appwrite/Platform/Workers/UsageHook.php @@ -46,17 +46,25 @@ class UsageHook extends Usage array_splice(self::$stats, 0, $offset); foreach ($projects as $data) { $numberOfKeys = !empty($data['keys']) ? count($data['keys']) : 0; - console::log(DateTime::now() . ' Iterating over ' . $numberOfKeys . ' keys'); + $projectInternalId = $data['project']->getInternalId(); + $database = $data['project']['database'] ?? ''; + + console::warning('Ticker started ' . DateTime::now()); if ($numberOfKeys === 0) { continue; } - $projectInternalId = $data['project']->getInternalId(); - try { $dbForProject = $getProjectDB($data['project']); - + if ($projectInternalId == 85293) { + var_dump([ + 'project' => $projectInternalId, + 'database' => $database, + 'time' => DateTime::now(), + 'data' => $data['keys'] + ]); + } foreach ($data['keys'] ?? [] as $key => $value) { if ($value == 0) { continue; @@ -67,6 +75,15 @@ class UsageHook extends Usage $id = \md5("{$time}_{$period}_{$key}"); try { + if ($projectInternalId == self::DEBUG_PROJECT_ID) { + var_dump([ + 'type' => 'create', + 'period' => $period, + 'metric' => $key, + 'id' => $id, + 'value' => $value + ]); + } $dbForProject->createDocument('stats_v2', new Document([ '$id' => $id, 'period' => $period, @@ -77,6 +94,15 @@ class UsageHook extends Usage ])); } catch (Duplicate $th) { if ($value < 0) { + if ($projectInternalId == self::DEBUG_PROJECT_ID) { + var_dump([ + 'type' => 'decrease', + 'period' => $period, + 'metric' => $key, + 'id' => $id, + 'value' => $value + ]); + } $dbForProject->decreaseDocumentAttribute( 'stats_v2', $id, @@ -84,6 +110,15 @@ class UsageHook extends Usage abs($value) ); } else { + if ($projectInternalId == self::DEBUG_PROJECT_ID) { + var_dump([ + 'type' => 'increase', + 'period' => $period, + 'metric' => $key, + 'id' => $id, + 'value' => $value + ]); + } $dbForProject->increaseDocumentAttribute( 'stats_v2', $id,