mirror of
https://github.com/appwrite/appwrite
synced 2026-05-24 09:28:40 +00:00
Merge branch '1.4.x' into fix-missing-sessionId-error
This commit is contained in:
commit
2d2400fdff
6 changed files with 132 additions and 18 deletions
|
|
@ -170,7 +170,7 @@ return [
|
||||||
'docs' => false,
|
'docs' => false,
|
||||||
'docsUrl' => '',
|
'docsUrl' => '',
|
||||||
'tests' => false,
|
'tests' => false,
|
||||||
'optional' => true,
|
'optional' => false,
|
||||||
'icon' => '',
|
'icon' => '',
|
||||||
],
|
],
|
||||||
'functions' => [
|
'functions' => [
|
||||||
|
|
@ -196,7 +196,7 @@ return [
|
||||||
'docs' => true,
|
'docs' => true,
|
||||||
'docsUrl' => 'https://appwrite.io/docs/proxy',
|
'docsUrl' => 'https://appwrite.io/docs/proxy',
|
||||||
'tests' => false,
|
'tests' => false,
|
||||||
'optional' => true,
|
'optional' => false,
|
||||||
'icon' => '/images/services/proxy.png',
|
'icon' => '/images/services/proxy.png',
|
||||||
],
|
],
|
||||||
'mock' => [
|
'mock' => [
|
||||||
|
|
@ -248,7 +248,7 @@ return [
|
||||||
'docs' => true,
|
'docs' => true,
|
||||||
'docsUrl' => 'https://appwrite.io/docs/migrations',
|
'docsUrl' => 'https://appwrite.io/docs/migrations',
|
||||||
'tests' => true,
|
'tests' => true,
|
||||||
'optional' => true,
|
'optional' => false,
|
||||||
'icon' => '/images/services/migrations.png',
|
'icon' => '/images/services/migrations.png',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -3632,7 +3632,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu
|
||||||
|
|
||||||
App::get('/v1/databases/usage')
|
App::get('/v1/databases/usage')
|
||||||
->desc('Get usage stats for the database')
|
->desc('Get usage stats for the database')
|
||||||
->groups(['api', 'database'])
|
->groups(['api', 'database', 'usage'])
|
||||||
->label('scope', 'collections.read')
|
->label('scope', 'collections.read')
|
||||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||||
->label('sdk.namespace', 'databases')
|
->label('sdk.namespace', 'databases')
|
||||||
|
|
@ -3750,7 +3750,7 @@ App::get('/v1/databases/usage')
|
||||||
|
|
||||||
App::get('/v1/databases/:databaseId/usage')
|
App::get('/v1/databases/:databaseId/usage')
|
||||||
->desc('Get usage stats for the database')
|
->desc('Get usage stats for the database')
|
||||||
->groups(['api', 'database'])
|
->groups(['api', 'database', 'usage'])
|
||||||
->label('scope', 'collections.read')
|
->label('scope', 'collections.read')
|
||||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||||
->label('sdk.namespace', 'databases')
|
->label('sdk.namespace', 'databases')
|
||||||
|
|
@ -3860,7 +3860,7 @@ App::get('/v1/databases/:databaseId/usage')
|
||||||
App::get('/v1/databases/:databaseId/collections/:collectionId/usage')
|
App::get('/v1/databases/:databaseId/collections/:collectionId/usage')
|
||||||
->alias('/v1/database/:collectionId/usage', ['databaseId' => 'default'])
|
->alias('/v1/database/:collectionId/usage', ['databaseId' => 'default'])
|
||||||
->desc('Get usage stats for a collection')
|
->desc('Get usage stats for a collection')
|
||||||
->groups(['api', 'database'])
|
->groups(['api', 'database', 'usage'])
|
||||||
->label('scope', 'collections.read')
|
->label('scope', 'collections.read')
|
||||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||||
->label('sdk.namespace', 'databases')
|
->label('sdk.namespace', 'databases')
|
||||||
|
|
|
||||||
|
|
@ -352,7 +352,7 @@ App::get('/v1/health/queue/webhooks')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::WEBHOOK_QUEUE_NAME, $queue);
|
$client = new Client(Event::WEBHOOK_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/logs')
|
App::get('/v1/health/queue/logs')
|
||||||
|
|
@ -370,7 +370,7 @@ App::get('/v1/health/queue/logs')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::AUDITS_QUEUE_NAME, $queue);
|
$client = new Client(Event::AUDITS_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/certificates')
|
App::get('/v1/health/queue/certificates')
|
||||||
|
|
@ -388,7 +388,7 @@ App::get('/v1/health/queue/certificates')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::CERTIFICATES_QUEUE_NAME, $queue);
|
$client = new Client(Event::CERTIFICATES_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/builds')
|
App::get('/v1/health/queue/builds')
|
||||||
|
|
@ -406,7 +406,7 @@ App::get('/v1/health/queue/builds')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::BUILDS_QUEUE_NAME, $queue);
|
$client = new Client(Event::BUILDS_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/databases')
|
App::get('/v1/health/queue/databases')
|
||||||
|
|
@ -425,7 +425,7 @@ App::get('/v1/health/queue/databases')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (string $name, Connection $queue, Response $response) {
|
->action(function (string $name, Connection $queue, Response $response) {
|
||||||
$client = new Client($name, $queue);
|
$client = new Client($name, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/deletes')
|
App::get('/v1/health/queue/deletes')
|
||||||
|
|
@ -443,7 +443,7 @@ App::get('/v1/health/queue/deletes')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::DELETE_QUEUE_NAME, $queue);
|
$client = new Client(Event::DELETE_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/mails')
|
App::get('/v1/health/queue/mails')
|
||||||
|
|
@ -461,7 +461,7 @@ App::get('/v1/health/queue/mails')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::MAILS_QUEUE_NAME, $queue);
|
$client = new Client(Event::MAILS_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/messaging')
|
App::get('/v1/health/queue/messaging')
|
||||||
|
|
@ -479,7 +479,7 @@ App::get('/v1/health/queue/messaging')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::MESSAGING_QUEUE_NAME, $queue);
|
$client = new Client(Event::MESSAGING_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/migrations')
|
App::get('/v1/health/queue/migrations')
|
||||||
|
|
@ -497,7 +497,7 @@ App::get('/v1/health/queue/migrations')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::MIGRATIONS_QUEUE_NAME, $queue);
|
$client = new Client(Event::MIGRATIONS_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/queue/functions')
|
App::get('/v1/health/queue/functions')
|
||||||
|
|
@ -515,7 +515,7 @@ App::get('/v1/health/queue/functions')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (Connection $queue, Response $response) {
|
->action(function (Connection $queue, Response $response) {
|
||||||
$client = new Client(Event::FUNCTIONS_QUEUE_NAME, $queue);
|
$client = new Client(Event::FUNCTIONS_QUEUE_NAME, $queue);
|
||||||
$response->dynamic(new Document([ 'size' => $client->sumProcessingJobs() ]), Response::MODEL_HEALTH_QUEUE);
|
$response->dynamic(new Document([ 'size' => $client->getQueueSize() ]), Response::MODEL_HEALTH_QUEUE);
|
||||||
}, ['response']);
|
}, ['response']);
|
||||||
|
|
||||||
App::get('/v1/health/storage/local')
|
App::get('/v1/health/storage/local')
|
||||||
|
|
|
||||||
|
|
@ -554,3 +554,11 @@ App::shutdown()
|
||||||
->submit();
|
->submit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
App::init()
|
||||||
|
->groups(['usage'])
|
||||||
|
->action(function () {
|
||||||
|
if (App::getEnv('_APP_USAGE_STATS', 'enabled') !== 'enabled') {
|
||||||
|
throw new Exception(Exception::GENERAL_USAGE_DISABLED);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
||||||
|
|
@ -178,7 +178,8 @@ class Deletes extends Action
|
||||||
$project = $dbForConsole->getDocument('projects', $document->getAttribute('projectId'));
|
$project = $dbForConsole->getDocument('projects', $document->getAttribute('projectId'));
|
||||||
|
|
||||||
if ($project->isEmpty()) {
|
if ($project->isEmpty()) {
|
||||||
Console::warning('Unable to delete schedule for function ' . $document->getAttribute('resourceId'));
|
$dbForConsole->deleteDocument('schedules', $document->getId());
|
||||||
|
Console::success('Deleted schedule for deleted project ' . $document->getAttribute('projectId'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -920,17 +921,28 @@ class Deletes extends Action
|
||||||
$count = 0;
|
$count = 0;
|
||||||
$chunk = 0;
|
$chunk = 0;
|
||||||
$limit = 50;
|
$limit = 50;
|
||||||
|
$results = [];
|
||||||
$sum = $limit;
|
$sum = $limit;
|
||||||
|
$cursor = null;
|
||||||
|
|
||||||
$executionStart = \microtime(true);
|
$executionStart = \microtime(true);
|
||||||
|
|
||||||
while ($sum === $limit) {
|
while ($sum === $limit) {
|
||||||
$chunk++;
|
$chunk++;
|
||||||
|
|
||||||
$results = $database->find($collection, \array_merge([Query::limit($limit)], $queries));
|
$mergedQueries = \array_merge([Query::limit($limit)], $queries);
|
||||||
|
if ($cursor instanceof Document) {
|
||||||
|
$mergedQueries[] = Query::cursorAfter($cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = $database->find($collection, $mergedQueries);
|
||||||
|
|
||||||
$sum = count($results);
|
$sum = count($results);
|
||||||
|
|
||||||
|
if ($sum > 0) {
|
||||||
|
$cursor = $results[$sum - 1];
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($results as $document) {
|
foreach ($results as $document) {
|
||||||
if (is_callable($callback)) {
|
if (is_callable($callback)) {
|
||||||
$callback($document);
|
$callback($document);
|
||||||
|
|
|
||||||
|
|
@ -1606,6 +1606,100 @@ class ProjectsConsoleClientTest extends Scope
|
||||||
$this->assertEquals(false, $response['body']['authPersonalDataCheck']);
|
$this->assertEquals(false, $response['body']['authPersonalDataCheck']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testUpdateProjectServicesAll(): void
|
||||||
|
{
|
||||||
|
$team = $this->client->call(Client::METHOD_POST, '/teams', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
|
||||||
|
]), [
|
||||||
|
'teamId' => ID::unique(),
|
||||||
|
'name' => 'Project Test',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $team['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($team['body']['$id']);
|
||||||
|
|
||||||
|
$project = $this->client->call(Client::METHOD_POST, '/projects', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
|
||||||
|
]), [
|
||||||
|
'projectId' => ID::unique(),
|
||||||
|
'name' => 'Project Test',
|
||||||
|
'teamId' => $team['body']['$id'],
|
||||||
|
'region' => 'default'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(201, $project['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($project['body']['$id']);
|
||||||
|
|
||||||
|
$id = $project['body']['$id'];
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $id . '/service/all', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
|
||||||
|
]), [
|
||||||
|
'status' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($response['body']['$id']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/projects/' . $id, array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
|
||||||
|
]));
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($response['body']['$id']);
|
||||||
|
|
||||||
|
$matches = [];
|
||||||
|
$pattern = '/serviceStatusFor.*/';
|
||||||
|
|
||||||
|
foreach ($response['body'] as $key => $value) {
|
||||||
|
if (\preg_match($pattern, $key)) {
|
||||||
|
\var_dump('Matched key: ' . $key);
|
||||||
|
$matches[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($matches as $value) {
|
||||||
|
$this->assertFalse($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $id . '/service/all', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
|
||||||
|
]), [
|
||||||
|
'status' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($response['body']['$id']);
|
||||||
|
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/projects/' . $id, array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
|
||||||
|
]));
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
|
||||||
|
$matches = [];
|
||||||
|
foreach ($response['body'] as $key => $value) {
|
||||||
|
if (\preg_match($pattern, $key)) {
|
||||||
|
$matches[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($matches as $value) {
|
||||||
|
$this->assertTrue($value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function testUpdateProjectServiceStatusAdmin(): array
|
public function testUpdateProjectServiceStatusAdmin(): array
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue