mirror of
https://github.com/appwrite/appwrite
synced 2026-05-24 09:28:40 +00:00
Merge branch '1.7.x' into fix-templates
This commit is contained in:
commit
bcd12fdfba
12 changed files with 290 additions and 16 deletions
|
|
@ -1417,6 +1417,13 @@ return [
|
||||||
'lengths' => [],
|
'lengths' => [],
|
||||||
'orders' => [Database::ORDER_ASC],
|
'orders' => [Database::ORDER_ASC],
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'$id' => ID::custom('_key_roles'),
|
||||||
|
'type' => Database::INDEX_KEY,
|
||||||
|
'attributes' => ['roles'],
|
||||||
|
'lengths' => [128],
|
||||||
|
'orders' => [],
|
||||||
|
],
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"openapi": "3.0.0",
|
"openapi": "3.0.0",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"title": "Appwrite",
|
"title": "Appwrite",
|
||||||
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
||||||
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
||||||
|
|
@ -6859,7 +6859,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queries",
|
"name": "queries",
|
||||||
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm",
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
"required": false,
|
"required": false,
|
||||||
"schema": {
|
"schema": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"openapi": "3.0.0",
|
"openapi": "3.0.0",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"title": "Appwrite",
|
"title": "Appwrite",
|
||||||
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
||||||
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
||||||
|
|
@ -25889,7 +25889,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queries",
|
"name": "queries",
|
||||||
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm",
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
"required": false,
|
"required": false,
|
||||||
"schema": {
|
"schema": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
|
|
@ -27982,6 +27982,30 @@
|
||||||
"x-example": "<USER_ID>"
|
"x-example": "<USER_ID>"
|
||||||
},
|
},
|
||||||
"in": "path"
|
"in": "path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "queries",
|
||||||
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": []
|
||||||
|
},
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "search",
|
||||||
|
"description": "Search term to filter your list results. Max length: 256 chars.",
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"x-example": "<SEARCH>",
|
||||||
|
"default": ""
|
||||||
|
},
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"openapi": "3.0.0",
|
"openapi": "3.0.0",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"title": "Appwrite",
|
"title": "Appwrite",
|
||||||
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
||||||
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
||||||
|
|
@ -18099,7 +18099,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queries",
|
"name": "queries",
|
||||||
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm",
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
"required": false,
|
"required": false,
|
||||||
"schema": {
|
"schema": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
|
|
@ -20153,6 +20153,30 @@
|
||||||
"x-example": "<USER_ID>"
|
"x-example": "<USER_ID>"
|
||||||
},
|
},
|
||||||
"in": "path"
|
"in": "path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "queries",
|
||||||
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": []
|
||||||
|
},
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "search",
|
||||||
|
"description": "Search term to filter your list results. Max length: 256 chars.",
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"x-example": "<SEARCH>",
|
||||||
|
"default": ""
|
||||||
|
},
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"swagger": "2.0",
|
"swagger": "2.0",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"title": "Appwrite",
|
"title": "Appwrite",
|
||||||
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
||||||
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
||||||
|
|
@ -7069,7 +7069,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queries",
|
"name": "queries",
|
||||||
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm",
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
"required": false,
|
"required": false,
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"collectionFormat": "multi",
|
"collectionFormat": "multi",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"swagger": "2.0",
|
"swagger": "2.0",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"title": "Appwrite",
|
"title": "Appwrite",
|
||||||
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
||||||
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
||||||
|
|
@ -26371,7 +26371,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queries",
|
"name": "queries",
|
||||||
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm",
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
"required": false,
|
"required": false,
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"collectionFormat": "multi",
|
"collectionFormat": "multi",
|
||||||
|
|
@ -28514,6 +28514,27 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"x-example": "<USER_ID>",
|
"x-example": "<USER_ID>",
|
||||||
"in": "path"
|
"in": "path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "queries",
|
||||||
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
|
"required": false,
|
||||||
|
"type": "array",
|
||||||
|
"collectionFormat": "multi",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": [],
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "search",
|
||||||
|
"description": "Search term to filter your list results. Max length: 256 chars.",
|
||||||
|
"required": false,
|
||||||
|
"type": "string",
|
||||||
|
"x-example": "<SEARCH>",
|
||||||
|
"default": "",
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"swagger": "2.0",
|
"swagger": "2.0",
|
||||||
"info": {
|
"info": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"title": "Appwrite",
|
"title": "Appwrite",
|
||||||
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
"description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)",
|
||||||
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
"termsOfService": "https:\/\/appwrite.io\/policy\/terms",
|
||||||
|
|
@ -18565,7 +18565,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "queries",
|
"name": "queries",
|
||||||
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm",
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
"required": false,
|
"required": false,
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"collectionFormat": "multi",
|
"collectionFormat": "multi",
|
||||||
|
|
@ -20669,6 +20669,27 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"x-example": "<USER_ID>",
|
"x-example": "<USER_ID>",
|
||||||
"in": "path"
|
"in": "path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "queries",
|
||||||
|
"description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles",
|
||||||
|
"required": false,
|
||||||
|
"type": "array",
|
||||||
|
"collectionFormat": "multi",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": [],
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "search",
|
||||||
|
"description": "Search term to filter your list results. Max length: 256 chars.",
|
||||||
|
"required": false,
|
||||||
|
"type": "string",
|
||||||
|
"x-example": "<SEARCH>",
|
||||||
|
"default": "",
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ use Appwrite\SDK\Method;
|
||||||
use Appwrite\SDK\Response as SDKResponse;
|
use Appwrite\SDK\Response as SDKResponse;
|
||||||
use Appwrite\Utopia\Database\Validator\CustomId;
|
use Appwrite\Utopia\Database\Validator\CustomId;
|
||||||
use Appwrite\Utopia\Database\Validator\Queries\Identities;
|
use Appwrite\Utopia\Database\Validator\Queries\Identities;
|
||||||
|
use Appwrite\Utopia\Database\Validator\Queries\Memberships;
|
||||||
use Appwrite\Utopia\Database\Validator\Queries\Targets;
|
use Appwrite\Utopia\Database\Validator\Queries\Targets;
|
||||||
use Appwrite\Utopia\Database\Validator\Queries\Users;
|
use Appwrite\Utopia\Database\Validator\Queries\Users;
|
||||||
use Appwrite\Utopia\Request;
|
use Appwrite\Utopia\Request;
|
||||||
|
|
@ -799,9 +800,11 @@ App::get('/v1/users/:userId/memberships')
|
||||||
]
|
]
|
||||||
))
|
))
|
||||||
->param('userId', '', new UID(), 'User ID.')
|
->param('userId', '', new UID(), 'User ID.')
|
||||||
|
->param('queries', [], new Memberships(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Memberships::ALLOWED_ATTRIBUTES), true)
|
||||||
|
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->inject('dbForProject')
|
->inject('dbForProject')
|
||||||
->action(function (string $userId, Response $response, Database $dbForProject) {
|
->action(function (string $userId, array $queries, string $search, Response $response, Database $dbForProject) {
|
||||||
|
|
||||||
$user = $dbForProject->getDocument('users', $userId);
|
$user = $dbForProject->getDocument('users', $userId);
|
||||||
|
|
||||||
|
|
@ -809,6 +812,19 @@ App::get('/v1/users/:userId/memberships')
|
||||||
throw new Exception(Exception::USER_NOT_FOUND);
|
throw new Exception(Exception::USER_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$queries = Query::parseQueries($queries);
|
||||||
|
} catch (QueryException $e) {
|
||||||
|
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($search)) {
|
||||||
|
$queries[] = Query::search('search', $search);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set internal queries
|
||||||
|
$queries[] = Query::equal('userInternalId', [$user->getInternalId()]);
|
||||||
|
|
||||||
$memberships = array_map(function ($membership) use ($dbForProject, $user) {
|
$memberships = array_map(function ($membership) use ($dbForProject, $user) {
|
||||||
$team = $dbForProject->getDocument('teams', $membership->getAttribute('teamId'));
|
$team = $dbForProject->getDocument('teams', $membership->getAttribute('teamId'));
|
||||||
|
|
||||||
|
|
@ -818,7 +834,7 @@ App::get('/v1/users/:userId/memberships')
|
||||||
->setAttribute('userEmail', $user->getAttribute('email'));
|
->setAttribute('userEmail', $user->getAttribute('email'));
|
||||||
|
|
||||||
return $membership;
|
return $membership;
|
||||||
}, $user->getAttribute('memberships', []));
|
}, $dbForProject->find('memberships', $queries));
|
||||||
|
|
||||||
$response->dynamic(new Document([
|
$response->dynamic(new Document([
|
||||||
'memberships' => $memberships,
|
'memberships' => $memberships,
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ abstract class Migration
|
||||||
'1.6.0' => 'V21',
|
'1.6.0' => 'V21',
|
||||||
'1.6.1' => 'V21',
|
'1.6.1' => 'V21',
|
||||||
'1.6.2' => 'V22',
|
'1.6.2' => 'V22',
|
||||||
|
'1.7.0' => 'V23',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
69
src/Appwrite/Migration/Version/V23.php
Normal file
69
src/Appwrite/Migration/Version/V23.php
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Migration\Version;
|
||||||
|
|
||||||
|
use Appwrite\Migration\Migration;
|
||||||
|
use Exception;
|
||||||
|
use Throwable;
|
||||||
|
use Utopia\CLI\Console;
|
||||||
|
use Utopia\Database\Database;
|
||||||
|
|
||||||
|
class V23 extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws Throwable
|
||||||
|
*/
|
||||||
|
public function execute(): void
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Disable SubQueries for Performance.
|
||||||
|
*/
|
||||||
|
foreach (['subQueryIndexes', 'subQueryPlatforms', 'subQueryDomains', 'subQueryKeys', 'subQueryWebhooks', 'subQuerySessions', 'subQueryTokens', 'subQueryMemberships', 'subQueryVariables', 'subQueryChallenges', 'subQueryProjectVariables', 'subQueryTargets', 'subQueryTopicTargets'] as $name) {
|
||||||
|
Database::addFilter(
|
||||||
|
$name,
|
||||||
|
fn () => null,
|
||||||
|
fn () => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console::info('Migrating Collections');
|
||||||
|
$this->migrateCollections();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate Collections.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws Exception|Throwable
|
||||||
|
*/
|
||||||
|
private function migrateCollections(): void
|
||||||
|
{
|
||||||
|
$internalProjectId = $this->project->getInternalId();
|
||||||
|
$collectionType = match ($internalProjectId) {
|
||||||
|
'console' => 'console',
|
||||||
|
default => 'projects',
|
||||||
|
};
|
||||||
|
|
||||||
|
$collections = $this->collections[$collectionType];
|
||||||
|
foreach ($collections as $collection) {
|
||||||
|
$id = $collection['$id'];
|
||||||
|
|
||||||
|
Console::log("Migrating Collection \"{$id}\"");
|
||||||
|
|
||||||
|
$this->projectDB->setNamespace("_$internalProjectId");
|
||||||
|
|
||||||
|
switch ($id) {
|
||||||
|
case 'memberships':
|
||||||
|
// Create roles index
|
||||||
|
try {
|
||||||
|
$this->createIndexFromCollection($this->projectDB, $id, '_key_roles');
|
||||||
|
} catch (Throwable $th) {
|
||||||
|
Console::warning("'_key_roles' from {$id}: {$th->getMessage()}");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(50000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,12 +9,12 @@ class Memberships extends Base
|
||||||
'teamId',
|
'teamId',
|
||||||
'invited',
|
'invited',
|
||||||
'joined',
|
'joined',
|
||||||
'confirm'
|
'confirm',
|
||||||
|
'roles',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Expression constructor
|
* Expression constructor
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -801,6 +801,97 @@ trait UsersBase
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testGetUser
|
||||||
|
*/
|
||||||
|
public function testListUserMemberships(array $data): array
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Test for SUCCESS
|
||||||
|
*/
|
||||||
|
|
||||||
|
// create a new team
|
||||||
|
$team = $this->client->call(Client::METHOD_POST, '/teams', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'teamId' => 'unique()',
|
||||||
|
'name' => 'Test Team',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// create a new membership
|
||||||
|
$membership = $this->client->call(Client::METHOD_POST, '/teams/' . $team['body']['$id'] . '/memberships', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'userId' => $data['userId'],
|
||||||
|
'roles' => ['new-role'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
// list the memberships
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'] . '/memberships', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()));
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertEquals($response['body']['memberships'][0]['$id'], $membership['body']['$id']);
|
||||||
|
$this->assertEquals($response['body']['memberships'][0]['roles'], ['new-role']);
|
||||||
|
$this->assertEquals($response['body']['total'], 1);
|
||||||
|
|
||||||
|
// create another membership with a new role
|
||||||
|
$team = $this->client->call(Client::METHOD_POST, '/teams', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'teamId' => 'unique()',
|
||||||
|
'name' => 'Test Team 2',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$membership = $this->client->call(Client::METHOD_POST, '/teams/' . $team['body']['$id'] . '/memberships', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'userId' => $data['userId'],
|
||||||
|
'roles' => ['new-role-2'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
// list out memberships and query by role
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'] . '/memberships', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'queries' => [
|
||||||
|
Query::contains('roles', ['new-role-2'])->toString()
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['headers']['status-code'], 200);
|
||||||
|
$this->assertEquals($response['body']['memberships'][0]['$id'], $membership['body']['$id']);
|
||||||
|
$this->assertEquals($response['body']['memberships'][0]['roles'], ['new-role-2']);
|
||||||
|
$this->assertEquals($response['body']['total'], 1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for FAILURE
|
||||||
|
*/
|
||||||
|
|
||||||
|
// query using equal on array field
|
||||||
|
$response = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'] . '/memberships', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'queries' => [
|
||||||
|
Query::equal('roles', ['new-role-2'])->toString()
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals($response['body']['code'], 400);
|
||||||
|
$this->assertEquals($response['body']['message'], 'Invalid `queries` param: Invalid query: Cannot query equal on attribute "roles" because it is an array.');
|
||||||
|
$this->assertEquals($response['body']['type'], 'general_argument_invalid');
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @depends testGetUser
|
* @depends testGetUser
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue