diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 81d4e87bc..72a5ee266 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -227,7 +227,7 @@ Before running the command, make sure you have proper write permissions to the A **Build for multicore** ```bash -docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t appwrite/multicore:0.0.0 --push +docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -t appwrite/appwrite:dev --push . ``` ## Tests diff --git a/README.md b/README.md index 75ca031af..42b37d53d 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@

-[![Hacktoberfest](https://badgen.net/badge/hacktoberfest/friendly/pink)](CONTRIBUTING.md) + [![Discord](https://img.shields.io/discord/564160730845151244?label=discord)](https://appwrite.io/discord) [![Docker Pulls](https://badgen.net/docker/pulls/appwrite/appwrite)](https://hub.docker.com/r/appwrite/appwrite) -[![Travis CI](https://badgen.net/travis/appwrite/appwrite?label=build)](https://travis-ci.com/appwrite/appwrite) +[![Build Status](https://travis-ci.com/appwrite/appwrite.svg?branch=master)](https://travis-ci.com/appwrite/appwrite) [![Twitter Account](https://badgen.net/twitter/follow/appwrite_io?label=twitter)](https://twitter.com/appwrite_io) [![Follow Appwrite on StackShare](https://badgen.net/badge/follow%20on/stackshare/blue)](https://stackshare.io/appwrite) @@ -18,10 +18,10 @@ Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend app Using Appwrite, you can easily integrate your app with user authentication & multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, schedule CRON tasks, and [more services](https://appwrite.io/docs). -Find out more at: [https://appwrite.io](https://appwrite.io) - ![Appwrite](public/images/github.png) +Find out more at: [https://appwrite.io](https://appwrite.io) + Table of Contents: - [Installation](#installation) diff --git a/app/config/platforms.php b/app/config/platforms.php index eea2a273e..0239be347 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -17,6 +17,7 @@ return [ 'name' => 'Web', 'version' => '1.1.0', 'url' => 'https://github.com/appwrite/sdk-for-js', + 'package' => 'https://www.npmjs.com/package/appwrite', 'enabled' => true, 'beta' => false, 'dev' => false, @@ -32,6 +33,7 @@ return [ 'name' => 'Flutter', 'version' => '0.3.0-dev.2', 'url' => 'https://github.com/appwrite/sdk-for-flutter', + 'package' => 'https://pub.dev/packages/appwrite', 'enabled' => true, 'beta' => true, 'dev' => false, @@ -47,6 +49,7 @@ return [ 'name' => 'Flutter (Dev Channel)', 'version' => '0.3.2', 'url' => 'https://github.com/appwrite/sdk-for-flutter-dev', + 'package' => '', 'enabled' => true, 'beta' => true, 'dev' => true, @@ -61,6 +64,7 @@ return [ 'key' => 'swift', 'name' => 'Swift', 'url' => '', + 'package' => '', 'enabled' => false, 'beta' => false, 'dev' => false, @@ -75,6 +79,7 @@ return [ 'key' => 'objective-c', 'name' => 'Objective C', 'url' => '', + 'package' => '', 'enabled' => false, 'beta' => false, 'dev' => false, @@ -89,6 +94,7 @@ return [ 'key' => 'kotlin', 'name' => 'Kotlin', 'url' => '', + 'package' => '', 'enabled' => false, 'beta' => false, 'dev' => false, @@ -127,6 +133,7 @@ return [ 'name' => 'Console', 'version' => '1.0.0', 'url' => 'https://github.com/appwrite/sdk-for-console', + 'package' => '', 'enabled' => true, 'beta' => false, 'dev' => false, @@ -152,6 +159,7 @@ return [ 'name' => 'Node.js', 'version' => '1.1.0', 'url' => 'https://github.com/appwrite/sdk-for-node', + 'package' => 'https://www.npmjs.com/package/node-appwrite', 'enabled' => true, 'beta' => false, 'dev' => false, @@ -167,6 +175,7 @@ return [ 'name' => 'Deno', 'version' => '0.0.2', 'url' => 'https://github.com/appwrite/sdk-for-deno', + 'package' => 'https://deno.land/x/appwrite', 'enabled' => true, 'beta' => true, 'dev' => false, @@ -182,6 +191,7 @@ return [ 'name' => 'PHP', 'version' => '1.1.0', 'url' => 'https://github.com/appwrite/sdk-for-php', + 'package' => 'https://packagist.org/packages/appwrite/appwrite', 'enabled' => true, 'beta' => false, 'dev' => false, @@ -197,6 +207,7 @@ return [ 'name' => 'Python', 'version' => '0.0.6', 'url' => 'https://github.com/appwrite/sdk-for-python', + 'package' => 'https://pypi.org/project/appwrite/', 'enabled' => true, 'beta' => true, 'dev' => false, @@ -212,6 +223,7 @@ return [ 'name' => 'Ruby', 'version' => '1.0.11', 'url' => 'https://github.com/appwrite/sdk-for-ruby', + 'package' => 'https://rubygems.org/gems/appwrite', 'enabled' => true, 'beta' => true, 'dev' => false, @@ -227,6 +239,7 @@ return [ 'name' => 'Go', 'version' => '0.0.7', 'url' => 'https://github.com/appwrite/sdk-for-go', + 'package' => '', 'enabled' => false, 'beta' => true, 'dev' => false, @@ -242,6 +255,7 @@ return [ 'name' => 'Java', 'version' => '0.0.2', 'url' => 'https://github.com/appwrite/sdk-for-java', + 'package' => '', 'enabled' => false, 'beta' => true, 'dev' => false, @@ -257,6 +271,7 @@ return [ 'name' => 'Dart', 'version' => '0.0.1', 'url' => 'https://github.com/appwrite/sdk-for-dart', + 'package' => '', 'enabled' => false, 'beta' => true, 'dev' => false, diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index 0a8dec442..dfa86d17b 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -110,9 +110,6 @@ App::get('/v1/database/collections') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'name', - 'orderType' => $orderType, - 'orderCast' => 'string', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_COLLECTIONS, @@ -401,7 +398,7 @@ App::get('/v1/database/collections/:collectionId/documents') ->param('filters', [], new ArrayList(new Text(128)), 'Array of filter strings. Each filter is constructed from a key name, comparison operator (=, !=, >, <, <=, >=) and a value. You can also use a dot (.) separator in attribute names to filter by child document attributes. Examples: \'name=John Doe\' or \'category.$id>=5bed2d152c362\'.', true) ->param('limit', 25, new Range(0, 100), 'Maximum number of documents to return in response. Use this value to manage pagination. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) ->param('offset', 0, new Range(0, 900000000), 'Offset value. The default value is 0. Use this param to manage pagination.', true) - ->param('orderField', '$id', new Text(128), 'Document field that results will be sorted by.', true) + ->param('orderField', '', new Text(128), 'Document field that results will be sorted by.', true) ->param('orderType', 'ASC', new WhiteList(['DESC', 'ASC'], true), 'Order direction. Possible values are DESC for descending order, or ASC for ascending order.', true) ->param('orderCast', 'string', new WhiteList(['int', 'string', 'date', 'time', 'datetime'], true), 'Order field type casting. Possible values are int, string, date, time or datetime. The database will attempt to cast the order field to the value you pass here. The default value is a string.', true) ->param('search', '', new Text(256), 'Search query. Enter any free text search. The database will try to find a match against all document attributes and children. Max length: 256 chars.', true) diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 476db0472..373dc6e45 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -88,9 +88,6 @@ App::get('/v1/functions') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'dateCreated', - 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_FUNCTIONS, @@ -484,9 +481,6 @@ App::get('/v1/functions/:functionId/tags') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'dateCreated', - 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_TAGS, @@ -682,9 +676,6 @@ App::get('/v1/functions/:functionId/executions') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'dateCreated', - 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_EXECUTIONS, diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index f8aa16936..606491308 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -109,9 +109,6 @@ App::get('/v1/projects') $results = $consoleDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'registration', - 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_PROJECTS, diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 972dede8a..db40959a9 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -178,9 +178,7 @@ App::get('/v1/storage/files') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'dateCreated', 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_FILES, diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 654b8f701..d1109db32 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -115,9 +115,7 @@ App::get('/v1/teams') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'dateCreated', 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_TEAMS, @@ -464,9 +462,7 @@ App::get('/v1/teams/:teamId/memberships') $memberships = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'joined', 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 90ff6cd1b..d2111668d 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -97,9 +97,7 @@ App::get('/v1/users') $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'registration', 'orderType' => $orderType, - 'orderCast' => 'int', 'search' => $search, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_USERS, diff --git a/app/controllers/general.php b/app/controllers/general.php index 9bc13632d..3b2c90554 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -400,7 +400,7 @@ App::error(function ($error, $utopia, $request, $response, $layout, $project) { } $response->dynamic(new Document($output), - $utopia->isDevelopment() ? Response::MODEL_ERROR_DEV : Response::MODEL_LOCALE); + $utopia->isDevelopment() ? Response::MODEL_ERROR_DEV : Response::MODEL_ERROR); }, ['error', 'utopia', 'request', 'response', 'layout', 'project']); App::get('/manifest.json') diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 9c61d9293..02e5af9e8 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -14,6 +14,7 @@ App::get('/v1/mock/tests/foo') ->desc('Mock a get request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'foo') ->label('sdk.method', 'get') ->label('sdk.description', 'Mock a get request for SDK tests') @@ -28,6 +29,7 @@ App::post('/v1/mock/tests/foo') ->desc('Mock a post request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'foo') ->label('sdk.method', 'post') ->label('sdk.description', 'Mock a post request for SDK tests') @@ -42,6 +44,7 @@ App::patch('/v1/mock/tests/foo') ->desc('Mock a patch request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'foo') ->label('sdk.method', 'patch') ->label('sdk.description', 'Mock a get request for SDK tests') @@ -56,6 +59,7 @@ App::put('/v1/mock/tests/foo') ->desc('Mock a put request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'foo') ->label('sdk.method', 'put') ->label('sdk.description', 'Mock a put request for SDK tests') @@ -70,6 +74,7 @@ App::delete('/v1/mock/tests/foo') ->desc('Mock a delete request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'foo') ->label('sdk.method', 'delete') ->label('sdk.description', 'Mock a delete request for SDK tests') @@ -84,6 +89,7 @@ App::get('/v1/mock/tests/bar') ->desc('Mock a get request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'bar') ->label('sdk.method', 'get') ->label('sdk.description', 'Mock a get request for SDK tests') @@ -98,6 +104,7 @@ App::post('/v1/mock/tests/bar') ->desc('Mock a post request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'bar') ->label('sdk.method', 'post') ->label('sdk.description', 'Mock a post request for SDK tests') @@ -112,6 +119,7 @@ App::patch('/v1/mock/tests/bar') ->desc('Mock a patch request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'bar') ->label('sdk.method', 'patch') ->label('sdk.description', 'Mock a get request for SDK tests') @@ -126,6 +134,7 @@ App::put('/v1/mock/tests/bar') ->desc('Mock a put request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'bar') ->label('sdk.method', 'put') ->label('sdk.description', 'Mock a put request for SDK tests') @@ -140,6 +149,7 @@ App::delete('/v1/mock/tests/bar') ->desc('Mock a delete request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'bar') ->label('sdk.method', 'delete') ->label('sdk.description', 'Mock a delete request for SDK tests') @@ -154,6 +164,7 @@ App::post('/v1/mock/tests/general/upload') ->desc('Mock a post request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'upload') ->label('sdk.description', 'Mock a delete request for SDK tests') @@ -194,6 +205,7 @@ App::get('/v1/mock/tests/general/redirect') ->desc('Mock a post request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'redirect') ->label('sdk.description', 'Mock a redirect request for SDK tests') @@ -201,13 +213,14 @@ App::get('/v1/mock/tests/general/redirect') ->action(function ($response) { /** @var Appwrite\Utopia\Response $response */ - $response->redirect('/v1/mock/tests/general/redirected'); + $response->redirect('/v1/mock/tests/general/redirect/done'); }, ['response']); -App::get('/v1/mock/tests/general/redirected') +App::get('/v1/mock/tests/general/redirect/done') ->desc('Mock a post request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'redirected') ->label('sdk.description', 'Mock a redirected request for SDK tests') @@ -219,6 +232,7 @@ App::get('/v1/mock/tests/general/set-cookie') ->desc('Mock a cookie request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'setCookie') ->label('sdk.description', 'Mock a set cookie request for SDK tests') @@ -233,6 +247,7 @@ App::get('/v1/mock/tests/general/get-cookie') ->desc('Mock a cookie request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'getCookie') ->label('sdk.description', 'Mock a get cookie request for SDK tests') @@ -249,6 +264,7 @@ App::get('/v1/mock/tests/general/empty') ->desc('Mock a post request for SDK tests') ->groups(['mock']) ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'empty') ->label('sdk.description', 'Mock a redirected request for SDK tests') diff --git a/app/controllers/web/home.php b/app/controllers/web/home.php index e57a6abb8..5d5b0281c 100644 --- a/app/controllers/web/home.php +++ b/app/controllers/web/home.php @@ -7,6 +7,7 @@ use Utopia\App; use Utopia\View; use Utopia\Config\Config; use Utopia\Exception; +use Utopia\Validator\Range; use Utopia\Validator\WhiteList; App::init(function ($layout) { @@ -188,7 +189,8 @@ App::get('/specs/:format') ->label('docs', false) ->param('format', 'swagger2', new WhiteList(['swagger2', 'open-api3'], true), 'Spec format.', true) ->param('platform', APP_PLATFORM_CLIENT, new WhiteList([APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER, APP_PLATFORM_CONSOLE], true), 'Choose target platform.', true) - ->action(function ($format, $platform, $utopia, $request, $response) { + ->param('tests', 0, function () {return new Range(0, 1);}, 'Include only test services.', true) + ->action(function ($format, $platform, $tests, $utopia, $request, $response) { /** @var Utopia\App $utopia */ /** @var Utopia\Swoole\Request $request */ /** @var Appwrite\Utopia\Response $response */ @@ -277,7 +279,11 @@ App::get('/specs/:format') continue; } - if ($route->getLabel('sdk.mock', false)) { + if ($route->getLabel('sdk.mock', false) && !$tests) { + continue; + } + + if (!$route->getLabel('sdk.mock', false) && $tests) { continue; } diff --git a/app/http.php b/app/http.php index afb9411ec..2197201d8 100644 --- a/app/http.php +++ b/app/http.php @@ -108,8 +108,9 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo if(App::isDevelopment()) { $swooleResponse->end('error: '.$th->getMessage()); } - - $swooleResponse->end('500: Server Error'); + else { + $swooleResponse->end('500: Server Error'); + } } }); diff --git a/app/tasks/install.php b/app/tasks/install.php index cd7e2a096..b28391d6d 100644 --- a/app/tasks/install.php +++ b/app/tasks/install.php @@ -143,9 +143,9 @@ $cli $stdout = ''; $stderr = ''; - Console::log("Running \"docker-compose -f {$path}/docker-compose.yml up -d --remove-orphans\""); + Console::log("Running \"docker-compose -f {$path}/docker-compose.yml up -d --remove-orphans --renew-anon-volumes\""); - $exit = Console::execute("docker-compose -f {$path}/docker-compose.yml up -d --remove-orphans", '', $stdout, $stderr); + $exit = Console::execute("docker-compose -f {$path}/docker-compose.yml up -d --remove-orphans --renew-anon-volumes", '', $stdout, $stderr); if ($exit !== 0) { Console::error("Failed to install Appwrite dockers"); diff --git a/app/tasks/migrate.php b/app/tasks/migrate.php index abfd295d8..bba8ad416 100644 --- a/app/tasks/migrate.php +++ b/app/tasks/migrate.php @@ -30,9 +30,7 @@ $callbacks = [ $all = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => '$uid', 'orderType' => 'DESC', - 'orderCast' => 'string', ]); $sum = \count($all); @@ -215,9 +213,6 @@ $cli $projects = $consoleDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'name', - 'orderType' => 'ASC', - 'orderCast' => 'string', 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_PROJECTS, ], diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index bf5512b41..b2ce2d6e3 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -13,6 +13,8 @@ services: - --providers.file.directory=/storage/config - --providers.file.watch=true - --providers.docker=true + - --providers.docker.exposedByDefault=false + - --providers.docker.constraints=Label(`traefik.constraint-label-stack`,`appwrite`) - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 restart: unless-stopped @@ -36,6 +38,8 @@ services: networks: - appwrite labels: + - traefik.enable=true + - traefik.constraint-label-stack=appwrite - traefik.http.routers.appwrite.rule=PathPrefix(`/`) - traefik.http.routers.appwrite-secure.rule=PathPrefix(`/`) - traefik.http.routers.appwrite-secure.tls=true @@ -288,7 +292,7 @@ services: - _APP_REDIS_PORT mariadb: - image: appwrite/mariadb:1.1.0 # fix issues when upgrading using: mysql_upgrade -u root -p + image: appwrite/mariadb:1.2.0 # fix issues when upgrading using: mysql_upgrade -u root -p container_name: appwrite-mariadb restart: unless-stopped networks: diff --git a/app/workers/certificates.php b/app/workers/certificates.php index 73d61107e..ef478fcde 100644 --- a/app/workers/certificates.php +++ b/app/workers/certificates.php @@ -88,9 +88,6 @@ class CertificatesV1 $certificate = $consoleDB->getCollectionFirst([ 'limit' => 1, 'offset' => 0, - 'orderField' => 'id', - 'orderType' => 'ASC', - 'orderCast' => 'string', 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_CERTIFICATES, 'domain='.$domain->get(), diff --git a/composer.json b/composer.json index 8628e48e2..3f7625a1e 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ }, "require-dev": { "swoole/ide-helper": "4.5.5", - "appwrite/sdk-generator": "master", + "appwrite/sdk-generator": "0.2.1", "phpunit/phpunit": "9.4.2", "vimeo/psalm": "4.1.1" }, diff --git a/composer.lock b/composer.lock index d260828c0..55284d5f2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3e96a4fbfbff083f2ca166fcfa6fbbbd", + "content-hash": "43a23882f28fd91a870f7b9e217b2ec3", "packages": [ { "name": "appwrite/php-clamav", @@ -1158,9 +1158,9 @@ ], "support": { "issues": "https://github.com/utopia-php/abuse/issues", - "source": "https://github.com/utopia-php/abuse/tree/0.3.1" + "source": "https://github.com/utopia-php/abuse/tree/0.2.2" }, - "time": "2020-12-21T17:28:03+00:00" + "time": "2020-10-23T06:51:42+00:00" }, { "name": "utopia-php/audit", @@ -1210,9 +1210,9 @@ ], "support": { "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/0.5.1" + "source": "https://github.com/utopia-php/audit/tree/0.3.2" }, - "time": "2020-12-21T17:28:53+00:00" + "time": "2020-10-23T08:09:44+00:00" }, { "name": "utopia-php/cache", @@ -1315,9 +1315,9 @@ ], "support": { "issues": "https://github.com/utopia-php/cli/issues", - "source": "https://github.com/utopia-php/cli/tree/0.8" + "source": "https://github.com/utopia-php/cli/tree/0.7.2" }, - "time": "2020-12-14T06:31:42+00:00" + "time": "2020-10-23T13:34:41+00:00" }, { "name": "utopia-php/config", @@ -1858,11 +1858,11 @@ }, { "name": "appwrite/sdk-generator", - "version": "dev-master", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "e78d94eb1bc538e988d7e45afca7304a98ffc3f1" + "reference": "9eb9c298c5db97ea2918bbbf6bd2830312e5330c" }, "require": { "ext-curl": "*", @@ -1893,7 +1893,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-11-11T09:53:31+00:00" + "time": "2020-12-23T16:00:49+00:00" }, { "name": "composer/package-versions-deprecated", @@ -2324,16 +2324,16 @@ }, { "name": "matthiasmullie/minify", - "version": "1.3.63", + "version": "1.3.64", "source": { "type": "git", "url": "https://github.com/matthiasmullie/minify.git", - "reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117" + "reference": "38f9d58c739687e269f46c6dff4647de9e2eb855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/9ba1b459828adc13430f4dd6c49dae4950dc4117", - "reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117", + "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/38f9d58c739687e269f46c6dff4647de9e2eb855", + "reference": "38f9d58c739687e269f46c6dff4647de9e2eb855", "shasum": "" }, "require": { @@ -2382,9 +2382,9 @@ ], "support": { "issues": "https://github.com/matthiasmullie/minify/issues", - "source": "https://github.com/matthiasmullie/minify/tree/1.3.63" + "source": "https://github.com/matthiasmullie/minify/tree/1.3.64" }, - "time": "2020-01-21T20:21:08+00:00" + "time": "2020-12-23T13:37:53+00:00" }, { "name": "matthiasmullie/path-converter", @@ -5091,12 +5091,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "0aeee2f70f4550e6c48c9a796d98f5ceda58dfda" + "reference": "5c448a39281b671be2cc8d208e6df75ac2d4b366" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/0aeee2f70f4550e6c48c9a796d98f5ceda58dfda", - "reference": "0aeee2f70f4550e6c48c9a796d98f5ceda58dfda", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/5c448a39281b671be2cc8d208e6df75ac2d4b366", + "reference": "5c448a39281b671be2cc8d208e6df75ac2d4b366", "shasum": "" }, "require": { @@ -5164,7 +5164,7 @@ "type": "tidelift" } ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2020-12-23T15:38:30+00:00" }, { "name": "symfony/string", diff --git a/docker-compose.nginx.yml b/docker-compose.nginx.yml index 845978fb8..9388c9939 100644 --- a/docker-compose.nginx.yml +++ b/docker-compose.nginx.yml @@ -88,7 +88,7 @@ services: - _APP_SMTP_PORT=25 mariadb: - image: appwrite/mariadb:1.1.0 # fix issues when upgrading using: mysql_upgrade -u root -p + image: appwrite/mariadb:1.2.0 # fix issues when upgrading using: mysql_upgrade -u root -p container_name: appwrite-mariadb restart: unless-stopped networks: diff --git a/docker-compose.yml b/docker-compose.yml index bbda6daf4..ed65d2e09 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,9 @@ +# WARNING! +# This is a development version of THE Appwrite docker-compose.yml file. +# Avoid using this file in your production environment. +# We're exposing here sensetive ports and mounting code volumes for rapid development and debugging of the server stack. +# For a production ready compose file please use: https://appwrite.io/docker-compose.yml + version: '3' services: @@ -10,6 +16,8 @@ services: - --providers.file.directory=/storage/config - --providers.file.watch=true - --providers.docker=true + - --providers.docker.exposedByDefault=false + - --providers.docker.constraints=Label(`traefik.constraint-label-stack`,`appwrite`) - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --accesslog=true @@ -17,7 +25,7 @@ services: ports: - 80:80 - 443:443 - - 8080:8080 + - 9500:8080 volumes: - /var/run/docker.sock:/var/run/docker.sock - appwrite-config:/storage/config:ro @@ -41,6 +49,8 @@ services: networks: - appwrite labels: + - traefik.enable=true + - traefik.constraint-label-stack=appwrite - traefik.http.routers.appwrite.rule=PathPrefix(`/`) - traefik.http.routers.appwrite-secure.rule=PathPrefix(`/`) - traefik.http.routers.appwrite-secure.tls=true @@ -314,7 +324,7 @@ services: - _APP_REDIS_PORT mariadb: - image: appwrite/mariadb:1.1.0 # fix issues when upgrading using: mysql_upgrade -u root -p + image: appwrite/mariadb:1.2.0 # fix issues when upgrading using: mysql_upgrade -u root -p container_name: appwrite-mariadb restart: unless-stopped networks: diff --git a/package-lock.json b/package-lock.json index 74ba37e99..681d22522 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2928,12 +2928,6 @@ "dev": true, "optional": true }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, @@ -3461,8 +3455,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true + "dev": true }, "gulp": { "version": "4.0.2", @@ -4012,9 +4005,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true }, "interpret": { @@ -4280,7 +4273,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "optional": true, "requires": { "is-docker": "^2.0.0" } @@ -6009,6 +6001,15 @@ "signal-exit": "^3.0.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "ls-service-form2json": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ls-service-form2json/-/ls-service-form2json-1.0.0.tgz", @@ -6317,11 +6318,10 @@ "dev": true }, "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", "dev": true, - "optional": true, "requires": { "growly": "^1.3.0", "is-wsl": "^2.2.0", @@ -6332,25 +6332,25 @@ }, "dependencies": { "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, - "optional": true + "requires": { + "lru-cache": "^6.0.0" + } }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", - "dev": true, - "optional": true + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "optional": true, "requires": { "isexe": "^2.0.0" } @@ -7317,8 +7317,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true + "dev": true }, "signal-exit": { "version": "3.0.2", @@ -8451,6 +8450,12 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", diff --git a/public/images/github.png b/public/images/github.png index e6cc04cc1..6f327b2de 100644 Binary files a/public/images/github.png and b/public/images/github.png differ diff --git a/src/Appwrite/Database/Adapter/MySQL.php b/src/Appwrite/Database/Adapter/MySQL.php index 456a411ce..8a7685429 100644 --- a/src/Appwrite/Database/Adapter/MySQL.php +++ b/src/Appwrite/Database/Adapter/MySQL.php @@ -501,7 +501,7 @@ class MySQL extends Adapter ]; $orderTypeMap = ['DESC', 'ASC']; - $options['orderField'] = (empty($options['orderField'])) ? '$id' : $options['orderField']; // Set default order field + $options['orderField'] = (empty($options['orderField'])) ? '' : $options['orderField']; // Set default order field $options['orderCast'] = (empty($options['orderCast'])) ? 'string' : $options['orderCast']; // Set default order field if (!\array_key_exists($options['orderCast'], $orderCastMap)) { @@ -567,34 +567,39 @@ class MySQL extends Adapter } // Sorting - $orderPath = \explode('.', $options['orderField']); - $len = \count($orderPath); - $orderKey = 'order_b'; - $part = $this->getPDO()->quote(\implode('', $orderPath), PDO::PARAM_STR); - $orderSelect = "CASE WHEN {$orderKey}.key = {$part} THEN CAST({$orderKey}.value AS {$orderCastMap[$options['orderCast']]}) END AS sort_ff"; - - if (1 === $len) { - //if($path == "''") { // Handle direct attributes queries - $sorts[] = 'LEFT JOIN `'.$this->getNamespace().".database.properties` order_b ON a.uid IS NOT NULL AND order_b.documentUid = a.uid AND (order_b.key = {$part})"; - } else { // Handle direct child attributes queries - $prev = 'c'; - $orderKey = 'order_e'; - - foreach ($orderPath as $y => $part) { - $part = $this->getPDO()->quote($part, PDO::PARAM_STR); - $x = $y - 1; - - if (0 === $y) { // First key - $sorts[] = 'JOIN `'.$this->getNamespace().".database.relationships` order_c{$y} ON a.uid IS NOT NULL AND order_c{$y}.start = a.uid AND order_c{$y}.key = {$part}"; - } elseif ($y == $len - 1) { // Last key - $sorts[] .= 'JOIN `'.$this->getNamespace().".database.properties` order_e ON order_e.documentUid = order_{$prev}{$x}.end AND order_e.key = {$part}"; - } else { - $sorts[] .= 'JOIN `'.$this->getNamespace().".database.relationships` order_d{$y} ON order_d{$y}.start = order_{$prev}{$x}.end AND order_d{$y}.key = {$part}"; - $prev = 'd'; + if(!empty($options['orderField'])) { + $orderPath = \explode('.', $options['orderField']); + $len = \count($orderPath); + $orderKey = 'order_b'; + $part = $this->getPDO()->quote(\implode('', $orderPath), PDO::PARAM_STR); + $orderSelect = "CASE WHEN {$orderKey}.key = {$part} THEN CAST({$orderKey}.value AS {$orderCastMap[$options['orderCast']]}) END AS sort_ff"; + + if (1 === $len) { + //if($path == "''") { // Handle direct attributes queries + $sorts[] = 'LEFT JOIN `'.$this->getNamespace().".database.properties` order_b ON a.uid IS NOT NULL AND order_b.documentUid = a.uid AND (order_b.key = {$part})"; + } else { // Handle direct child attributes queries + $prev = 'c'; + $orderKey = 'order_e'; + + foreach ($orderPath as $y => $part) { + $part = $this->getPDO()->quote($part, PDO::PARAM_STR); + $x = $y - 1; + + if (0 === $y) { // First key + $sorts[] = 'JOIN `'.$this->getNamespace().".database.relationships` order_c{$y} ON a.uid IS NOT NULL AND order_c{$y}.start = a.uid AND order_c{$y}.key = {$part}"; + } elseif ($y == $len - 1) { // Last key + $sorts[] .= 'JOIN `'.$this->getNamespace().".database.properties` order_e ON order_e.documentUid = order_{$prev}{$x}.end AND order_e.key = {$part}"; + } else { + $sorts[] .= 'JOIN `'.$this->getNamespace().".database.relationships` order_d{$y} ON order_d{$y}.start = order_{$prev}{$x}.end AND order_d{$y}.key = {$part}"; + $prev = 'd'; + } } - } + } } - + else { + $orderSelect = 'a.uid AS sort_ff'; + } + /* * Workaround for a MySQL bug as reported here: * https://bugs.mysql.com/bug.php?id=78485 diff --git a/src/Appwrite/Database/Database.php b/src/Appwrite/Database/Database.php index e8dd33db8..8610aeac1 100644 --- a/src/Appwrite/Database/Database.php +++ b/src/Appwrite/Database/Database.php @@ -149,7 +149,7 @@ class Database 'limit' => 15, 'search' => '', 'relations' => true, - 'orderField' => '$id', + 'orderField' => '', 'orderType' => 'ASC', 'orderCast' => 'int', 'filters' => [], diff --git a/tests/resources/docker/docker-compose.yml b/tests/resources/docker/docker-compose.yml index eacb4ec1a..7d82a8399 100644 --- a/tests/resources/docker/docker-compose.yml +++ b/tests/resources/docker/docker-compose.yml @@ -275,7 +275,7 @@ services: - _APP_REDIS_PORT mariadb: - image: appwrite/mariadb:1.1.0 # fix issues when upgrading using: mysql_upgrade -u root -p + image: appwrite/mariadb:1.2.0 # fix issues when upgrading using: mysql_upgrade -u root -p container_name: appwrite-mariadb restart: unless-stopped networks: