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()