diff --git a/.gitignore b/.gitignore index ef05c948ff..5ae03e2a56 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ !/.idea/php.xml .DS_Store .php_cs.cache +.phpactor.json debug/ app/sdks dev/yasd_init.php diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c9a244dd65..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "app/console"] - path = app/console - url = https://github.com/appwrite/console - branch = 1.6.x diff --git a/Dockerfile b/Dockerfile index 56c22fe679..6f0fdcb7b7 100755 --- a/Dockerfile +++ b/Dockerfile @@ -12,23 +12,6 @@ RUN composer install --ignore-platform-reqs --optimize-autoloader \ --no-plugins --no-scripts --prefer-dist \ `if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi` -FROM --platform=$BUILDPLATFORM node:20.11.0-alpine3.19 as node - -COPY app/console /usr/local/src/console - -WORKDIR /usr/local/src/console - -ARG VITE_GA_PROJECT -ARG VITE_CONSOLE_MODE -ARG VITE_APPWRITE_GROWTH_ENDPOINT=https://growth.appwrite.io/v1 - -ENV VITE_GA_PROJECT=$VITE_GA_PROJECT -ENV VITE_CONSOLE_MODE=$VITE_CONSOLE_MODE -ENV VITE_APPWRITE_GROWTH_ENDPOINT=$VITE_APPWRITE_GROWTH_ENDPOINT - -RUN npm ci -RUN npm run build - FROM appwrite/base:0.9.1 as final LABEL maintainer="team@appwrite.io" @@ -48,7 +31,6 @@ RUN \ WORKDIR /usr/src/code COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor -COPY --from=node /usr/local/src/console/build /usr/src/code/console # Add Source Code COPY ./app /usr/src/code/app diff --git a/app/config/platforms.php b/app/config/platforms.php index 7b0e315902..3a77b99887 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -221,7 +221,7 @@ return [ [ 'key' => 'cli', 'name' => 'Command Line', - 'version' => '6.0.0-rc.3', + 'version' => '6.0.0-rc.4', 'url' => 'https://github.com/appwrite/sdk-for-cli', 'package' => 'https://www.npmjs.com/package/appwrite-cli', 'enabled' => true, diff --git a/app/console b/app/console deleted file mode 160000 index f978cecfaf..0000000000 --- a/app/console +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f978cecfafe55e85fcd20fe90fc020e78a7c7952 diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index fac8d21261..a4c76a9a35 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -16,8 +16,7 @@ App::init() ; }); -App::get('/console/*') - ->alias('/') +App::get('/') ->alias('auth/*') ->alias('/invite') ->alias('/login') @@ -31,45 +30,13 @@ App::get('/console/*') ->inject('request') ->inject('response') ->action(function (Request $request, Response $response) { - $fallback = file_get_contents(__DIR__ . '/../../../console/index.html'); - - // Card SSR - if (\str_starts_with($request->getURI(), '/card')) { - $urlCunks = \explode('/', $request->getURI()); - $userId = $urlCunks[\count($urlCunks) - 1] ?? ''; - - $domain = $request->getProtocol() . '://' . $request->getHostname(); - - if (!empty($userId)) { - $ogImageUrl = $domain . '/v1/cards/cloud-og?userId=' . $userId; - } else { - $ogImageUrl = $domain . '/v1/cards/cloud-og?mock=normal'; - } - - $ogTags = [ - 'Appwrite Cloud Card', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - ]; - - $fallback = \str_replace('', \implode('', $ogTags), $fallback); + $url = parse_url($request->getURI()); + $target = "/console{$url['path']}"; + if ($url['query'] ?? false) { + $target .= "?{$url['query']}"; } - - $response->html($fallback); + if ($url['fragment'] ?? false) { + $target .= "#{$url['fragment']}"; + } + $response->redirect($target); }); diff --git a/app/http.php b/app/http.php index f410d98a0c..ac40639057 100644 --- a/app/http.php +++ b/app/http.php @@ -57,8 +57,6 @@ $http->on(Constant::EVENT_AFTER_RELOAD, function ($server, $workerId) { Console::success('Reload completed...'); }); -Files::load(__DIR__ . '/../console'); - include __DIR__ . '/controllers/general.php'; $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $register) { diff --git a/app/init.php b/app/init.php index a0e71f041b..ef7742956f 100644 --- a/app/init.php +++ b/app/init.php @@ -118,7 +118,7 @@ const APP_USER_ACCESS = 24 * 60 * 60; // 24 hours const APP_PROJECT_ACCESS = 24 * 60 * 60; // 24 hours const APP_CACHE_UPDATE = 24 * 60 * 60; // 24 hours const APP_CACHE_BUSTER = 4314; -const APP_VERSION_STABLE = '1.5.7'; +const APP_VERSION_STABLE = '1.6.0'; const APP_DATABASE_ATTRIBUTE_EMAIL = 'email'; const APP_DATABASE_ATTRIBUTE_ENUM = 'enum'; const APP_DATABASE_ATTRIBUTE_IP = 'ip'; diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index fb88db4f39..70c6fbdebd 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -163,6 +163,28 @@ $image = $this->getParam('image', ''); - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET - _APP_ASSISTANT_OPENAI_API_KEY + appwrite-console: + <<: *x-logging + container_name: appwrite-console + image: /console:appwrite/console:5.0.0-rc.11 + restart: unless-stopped + networks: + - appwrite + labels: + - "traefik.enable=true" + - "traefik.constraint-label-stack=appwrite" + - "traefik.docker.network=appwrite" + - "traefik.http.services.appwrite_console.loadbalancer.server.port=80" + #ws + - traefik.http.routers.appwrite_console_http.entrypoints=appwrite_web + - traefik.http.routers.appwrite_console_http.rule=PathPrefix(`/console`) + - traefik.http.routers.appwrite_console_http.service=appwrite_console + # wss + - traefik.http.routers.appwrite_console_https.entrypoints=appwrite_websecure + - traefik.http.routers.appwrite_console_https.rule=PathPrefix(`/console`) + - traefik.http.routers.appwrite_console_https.service=appwrite_console + - traefik.http.routers.appwrite_console_https.tls=true + appwrite-realtime: image: /: entrypoint: realtime diff --git a/composer.lock b/composer.lock index 8d307c5c99..68f109ed72 100644 --- a/composer.lock +++ b/composer.lock @@ -356,16 +356,16 @@ }, { "name": "chillerlan/php-settings-container", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "f705310389264c3578fdd9ffb15aa2cd6d91772e" + "reference": "5553558bd381fce5108c6d0343c12e488cfec6bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/f705310389264c3578fdd9ffb15aa2cd6d91772e", - "reference": "f705310389264c3578fdd9ffb15aa2cd6d91772e", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/5553558bd381fce5108c6d0343c12e488cfec6bb", + "reference": "5553558bd381fce5108c6d0343c12e488cfec6bb", "shasum": "" }, "require": { @@ -373,15 +373,16 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phan/phan": "^5.4", - "phpcsstandards/php_codesniffer": "^3.8", - "phpmd/phpmd": "^2.13", - "phpunit/phpunit": "^9.6" + "phpmd/phpmd": "^2.15", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-deprecation-rules": "^1.2", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "^3.10" }, "type": "library", "autoload": { "psr-4": { - "chillerlan\\Settings\\": "src/" + "chillerlan\\Settings\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -418,7 +419,7 @@ "type": "ko_fi" } ], - "time": "2024-01-05T23:20:55+00:00" + "time": "2024-07-17T01:04:28+00:00" }, { "name": "dragonmantank/cron-expression", @@ -2989,16 +2990,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.39.2", + "version": "0.39.3", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "550b56aa7ee3f98319b79a20d2478e68a1b5e9bd" + "reference": "16142d88270e368030d7956cadf2d7816413f8c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/550b56aa7ee3f98319b79a20d2478e68a1b5e9bd", - "reference": "550b56aa7ee3f98319b79a20d2478e68a1b5e9bd", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/16142d88270e368030d7956cadf2d7816413f8c4", + "reference": "16142d88270e368030d7956cadf2d7816413f8c4", "shasum": "" }, "require": { @@ -3034,9 +3035,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.39.2" + "source": "https://github.com/appwrite/sdk-generator/tree/0.39.3" }, - "time": "2024-07-10T11:23:54+00:00" + "time": "2024-07-12T15:29:48+00:00" }, { "name": "doctrine/deprecations", diff --git a/docker-compose.yml b/docker-compose.yml index 7be1225eaa..d28586bf7b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,7 +52,7 @@ services: DEBUG: false TESTING: true VERSION: dev - ports: + ports: - 9501:80 networks: - appwrite @@ -192,6 +192,28 @@ services: - _APP_EXPERIMENT_LOGGING_CONFIG - _APP_DATABASE_SHARED_TABLES + appwrite-console: + <<: *x-logging + container_name: appwrite-console + image: appwrite/console:5.0.0-rc.11 + restart: unless-stopped + networks: + - appwrite + labels: + - "traefik.enable=true" + - "traefik.constraint-label-stack=appwrite" + - "traefik.docker.network=appwrite" + - "traefik.http.services.appwrite_console.loadbalancer.server.port=80" + #ws + - traefik.http.routers.appwrite_console_http.entrypoints=appwrite_web + - traefik.http.routers.appwrite_console_http.rule=PathPrefix(`/console`) + - traefik.http.routers.appwrite_console_http.service=appwrite_console + # wss + - traefik.http.routers.appwrite_console_https.entrypoints=appwrite_websecure + - traefik.http.routers.appwrite_console_https.rule=PathPrefix(`/console`) + - traefik.http.routers.appwrite_console_https.service=appwrite_console + - traefik.http.routers.appwrite_console_https.tls=true + appwrite-realtime: entrypoint: realtime <<: *x-logging diff --git a/docs/examples/1.6.x/console-cli/examples/account/delete-mfa-authenticator.md b/docs/examples/1.6.x/console-cli/examples/account/delete-mfa-authenticator.md index c36e9d5578..d4664855b5 100644 --- a/docs/examples/1.6.x/console-cli/examples/account/delete-mfa-authenticator.md +++ b/docs/examples/1.6.x/console-cli/examples/account/delete-mfa-authenticator.md @@ -1,3 +1,2 @@ appwrite account deleteMfaAuthenticator \ - --type totp \ - --otp + --type totp diff --git a/phpunit.xml b/phpunit.xml index 90ebd4225f..e772866051 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -6,7 +6,7 @@ convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" - stopOnFailure="false" + stopOnFailure="true" > diff --git a/src/Appwrite/Migration/Migration.php b/src/Appwrite/Migration/Migration.php index e3a2021c1a..597943f842 100644 --- a/src/Appwrite/Migration/Migration.php +++ b/src/Appwrite/Migration/Migration.php @@ -86,6 +86,7 @@ abstract class Migration '1.5.5' => 'V20', '1.5.6' => 'V20', '1.5.7' => 'V20', + '1.6.0' => 'V21', ]; /** diff --git a/src/Appwrite/Migration/Version/V21.php b/src/Appwrite/Migration/Version/V21.php new file mode 100644 index 0000000000..75d083d87d --- /dev/null +++ b/src/Appwrite/Migration/Version/V21.php @@ -0,0 +1,72 @@ + null, + fn () => [] + ); + } + + Console::log('Migrating Project: ' . $this->project->getAttribute('name') . ' (' . $this->project->getId() . ')'); + $this->projectDB->setNamespace("_{$this->project->getInternalId()}"); + + 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 'projects': + + // Create accessedAt attribute + try { + $this->createAttributeFromCollection($this->projectDB, $id, 'accessedAt'); + } catch (Throwable $th) { + Console::warning("'accessedAt' from {$id}: {$th->getMessage()}"); + } + + break; + } + } + } +} diff --git a/tests/e2e/General/HTTPTest.php b/tests/e2e/General/HTTPTest.php index 92bc52561c..5c3b10a9ca 100644 --- a/tests/e2e/General/HTTPTest.php +++ b/tests/e2e/General/HTTPTest.php @@ -15,7 +15,7 @@ class HTTPTest extends Scope public function setUp(): void { parent::setUp(); - $this->client->setEndpoint('http://localhost'); + $this->client->setEndpoint('http://traefik'); } public function testOptions() @@ -163,11 +163,11 @@ class HTTPTest extends Scope public function testDefaultOAuth2() { - $response = $this->client->call(Client::METHOD_GET, '/auth/oauth2/success', $this->getHeaders()); + $response = $this->client->call(Client::METHOD_GET, '/console/auth/oauth2/success', $this->getHeaders()); $this->assertEquals(200, $response['headers']['status-code']); - $response = $this->client->call(Client::METHOD_GET, '/auth/oauth2/failure', $this->getHeaders()); + $response = $this->client->call(Client::METHOD_GET, '/console/auth/oauth2/failure', $this->getHeaders()); $this->assertEquals(200, $response['headers']['status-code']); } diff --git a/tests/e2e/General/HooksTest.php b/tests/e2e/General/HooksTest.php index d67c3256d9..af6ccab0d5 100644 --- a/tests/e2e/General/HooksTest.php +++ b/tests/e2e/General/HooksTest.php @@ -17,7 +17,7 @@ class HooksTest extends Scope public function setUp(): void { parent::setUp(); - $this->client->setEndpoint('http://localhost'); + $this->client->setEndpoint('http://traefik'); } public function testProjectHooks()