mirror of
https://github.com/appwrite/appwrite
synced 2026-05-24 09:28:40 +00:00
Merge pull request #11049 from appwrite/console-module
This commit is contained in:
commit
f875b965be
17 changed files with 471 additions and 194 deletions
|
|
@ -20,7 +20,7 @@ return [
|
||||||
'name' => 'Console',
|
'name' => 'Console',
|
||||||
'subtitle' => '',
|
'subtitle' => '',
|
||||||
'description' => '',
|
'description' => '',
|
||||||
'controller' => 'web/console.php',
|
'controller' => '', // Uses modules
|
||||||
'sdk' => false,
|
'sdk' => false,
|
||||||
'docs' => false,
|
'docs' => false,
|
||||||
'docsUrl' => '',
|
'docsUrl' => '',
|
||||||
|
|
@ -270,9 +270,9 @@ return [
|
||||||
'console' => [
|
'console' => [
|
||||||
'key' => 'console',
|
'key' => 'console',
|
||||||
'name' => 'Console',
|
'name' => 'Console',
|
||||||
'subtitle' => 'The Console service allows you to interact with console relevant informations.',
|
'subtitle' => 'The Console service allows you to interact with console relevant information.',
|
||||||
'description' => '',
|
'description' => '',
|
||||||
'controller' => 'api/console.php',
|
'controller' => '', // Uses modules
|
||||||
'sdk' => true,
|
'sdk' => true,
|
||||||
'docs' => true,
|
'docs' => true,
|
||||||
'docsUrl' => '',
|
'docsUrl' => '',
|
||||||
|
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
use Appwrite\Extend\Exception;
|
|
||||||
use Appwrite\SDK\AuthType;
|
|
||||||
use Appwrite\SDK\ContentType;
|
|
||||||
use Appwrite\SDK\Method;
|
|
||||||
use Appwrite\SDK\Response as SDKResponse;
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Utopia\App;
|
|
||||||
use Utopia\Database\Document;
|
|
||||||
use Utopia\Domains\Domain;
|
|
||||||
use Utopia\System\System;
|
|
||||||
use Utopia\Validator\IP;
|
|
||||||
use Utopia\Validator\Text;
|
|
||||||
|
|
||||||
App::init()
|
|
||||||
->groups(['console'])
|
|
||||||
->inject('project')
|
|
||||||
->action(function (Document $project) {
|
|
||||||
if ($project->getId() !== 'console') {
|
|
||||||
throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
App::get('/v1/console/variables')
|
|
||||||
->desc('Get variables')
|
|
||||||
->groups(['api', 'projects'])
|
|
||||||
->label('scope', 'projects.read')
|
|
||||||
->label('sdk', new Method(
|
|
||||||
namespace: 'console',
|
|
||||||
group: 'console',
|
|
||||||
name: 'variables',
|
|
||||||
description: '/docs/references/console/variables.md',
|
|
||||||
auth: [AuthType::ADMIN],
|
|
||||||
responses: [
|
|
||||||
new SDKResponse(
|
|
||||||
code: Response::STATUS_CODE_OK,
|
|
||||||
model: Response::MODEL_CONSOLE_VARIABLES,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
contentType: ContentType::JSON
|
|
||||||
))
|
|
||||||
->inject('response')
|
|
||||||
->action(function (Response $response) {
|
|
||||||
$validator = new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME'));
|
|
||||||
$isCNAMEValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')) && $validator->isKnown() && !$validator->isTest();
|
|
||||||
|
|
||||||
$validator = new IP(IP::V4);
|
|
||||||
$isAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_A', '')) && ($validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_A')));
|
|
||||||
|
|
||||||
$validator = new IP(IP::V6);
|
|
||||||
$isAAAAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_AAAA', '')) && $validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_AAAA'));
|
|
||||||
|
|
||||||
$isDomainEnabled = $isAAAAValid || $isAValid || $isCNAMEValid;
|
|
||||||
|
|
||||||
$isVcsEnabled = !empty(System::getEnv('_APP_VCS_GITHUB_APP_NAME', ''))
|
|
||||||
&& !empty(System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY', ''))
|
|
||||||
&& !empty(System::getEnv('_APP_VCS_GITHUB_APP_ID', ''))
|
|
||||||
&& !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', ''))
|
|
||||||
&& !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', ''));
|
|
||||||
|
|
||||||
$isAssistantEnabled = !empty(System::getEnv('_APP_ASSISTANT_OPENAI_API_KEY', ''));
|
|
||||||
|
|
||||||
$variables = new Document([
|
|
||||||
'_APP_DOMAIN_TARGET_CNAME' => System::getEnv('_APP_DOMAIN_TARGET_CNAME'),
|
|
||||||
'_APP_DOMAIN_TARGET_AAAA' => System::getEnv('_APP_DOMAIN_TARGET_AAAA'),
|
|
||||||
'_APP_DOMAIN_TARGET_A' => System::getEnv('_APP_DOMAIN_TARGET_A'),
|
|
||||||
// Combine CAA domain with most common flags and tag (no parameters)
|
|
||||||
'_APP_DOMAIN_TARGET_CAA' => '0 issue "' . System::getEnv('_APP_DOMAIN_TARGET_CAA') . '"',
|
|
||||||
'_APP_STORAGE_LIMIT' => +System::getEnv('_APP_STORAGE_LIMIT'),
|
|
||||||
'_APP_COMPUTE_BUILD_TIMEOUT' => +System::getEnv('_APP_COMPUTE_BUILD_TIMEOUT'),
|
|
||||||
'_APP_COMPUTE_SIZE_LIMIT' => +System::getEnv('_APP_COMPUTE_SIZE_LIMIT'),
|
|
||||||
'_APP_USAGE_STATS' => System::getEnv('_APP_USAGE_STATS'),
|
|
||||||
'_APP_VCS_ENABLED' => $isVcsEnabled,
|
|
||||||
'_APP_DOMAIN_ENABLED' => $isDomainEnabled,
|
|
||||||
'_APP_ASSISTANT_ENABLED' => $isAssistantEnabled,
|
|
||||||
'_APP_DOMAIN_SITES' => System::getEnv('_APP_DOMAIN_SITES'),
|
|
||||||
'_APP_DOMAIN_FUNCTIONS' => System::getEnv('_APP_DOMAIN_FUNCTIONS'),
|
|
||||||
'_APP_OPTIONS_FORCE_HTTPS' => System::getEnv('_APP_OPTIONS_FORCE_HTTPS'),
|
|
||||||
'_APP_DOMAINS_NAMESERVERS' => System::getEnv('_APP_DOMAINS_NAMESERVERS'),
|
|
||||||
]);
|
|
||||||
|
|
||||||
$response->dynamic($variables, Response::MODEL_CONSOLE_VARIABLES);
|
|
||||||
});
|
|
||||||
|
|
||||||
App::post('/v1/console/assistant')
|
|
||||||
->desc('Create assistant query')
|
|
||||||
->groups(['api', 'assistant'])
|
|
||||||
->label('scope', 'assistant.read')
|
|
||||||
->label('sdk', new Method(
|
|
||||||
namespace: 'assistant',
|
|
||||||
group: 'console',
|
|
||||||
name: 'chat',
|
|
||||||
description: '/docs/references/assistant/chat.md',
|
|
||||||
auth: [AuthType::ADMIN],
|
|
||||||
responses: [
|
|
||||||
new SDKResponse(
|
|
||||||
code: Response::STATUS_CODE_OK,
|
|
||||||
model: Response::MODEL_NONE,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
contentType: ContentType::TEXT
|
|
||||||
))
|
|
||||||
->label('abuse-limit', 15)
|
|
||||||
->label('abuse-key', 'userId:{userId}')
|
|
||||||
->param('prompt', '', new Text(2000), 'Prompt. A string containing questions asked to the AI assistant.')
|
|
||||||
->inject('response')
|
|
||||||
->action(function (string $prompt, Response $response) {
|
|
||||||
$ch = curl_init('http://appwrite-assistant:3003/v1/models/assistant/prompt');
|
|
||||||
$responseHeaders = [];
|
|
||||||
$query = json_encode(['prompt' => $prompt]);
|
|
||||||
$headers = ['accept: text/event-stream'];
|
|
||||||
$handleEvent = function ($ch, $data) use ($response) {
|
|
||||||
$response->chunk($data);
|
|
||||||
|
|
||||||
return \strlen($data);
|
|
||||||
};
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $handleEvent);
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
|
|
||||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
||||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
|
|
||||||
curl_setopt($ch, CURLOPT_TIMEOUT, 9000);
|
|
||||||
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) {
|
|
||||||
$len = strlen($header);
|
|
||||||
$header = explode(':', $header, 2);
|
|
||||||
|
|
||||||
if (count($header) < 2) { // ignore invalid headers
|
|
||||||
return $len;
|
|
||||||
}
|
|
||||||
|
|
||||||
$responseHeaders[strtolower(trim($header[0]))] = trim($header[1]);
|
|
||||||
|
|
||||||
return $len;
|
|
||||||
});
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
|
|
||||||
|
|
||||||
curl_exec($ch);
|
|
||||||
|
|
||||||
curl_close($ch);
|
|
||||||
|
|
||||||
$response->chunk('', true);
|
|
||||||
});
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Request;
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Utopia\App;
|
|
||||||
|
|
||||||
App::init()
|
|
||||||
->groups(['web'])
|
|
||||||
->inject('request')
|
|
||||||
->inject('response')
|
|
||||||
->action(function (Request $request, Response $response) {
|
|
||||||
$response
|
|
||||||
->addHeader('X-Frame-Options', 'SAMEORIGIN') // Avoid console and homepage from showing in iframes
|
|
||||||
->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url=' . \urlencode($request->getURI()))
|
|
||||||
->addHeader('X-UA-Compatible', 'IE=Edge') // Deny IE browsers from going into quirks mode
|
|
||||||
;
|
|
||||||
});
|
|
||||||
|
|
||||||
App::get('/')
|
|
||||||
->alias('auth/*')
|
|
||||||
->alias('/invite')
|
|
||||||
->alias('/login')
|
|
||||||
->alias('/mfa')
|
|
||||||
->alias('/card/*')
|
|
||||||
->alias('/recover')
|
|
||||||
->alias('/register/*')
|
|
||||||
->groups(['web'])
|
|
||||||
->label('permission', 'public')
|
|
||||||
->label('scope', 'home')
|
|
||||||
->inject('request')
|
|
||||||
->inject('response')
|
|
||||||
->action(function (Request $request, Response $response) {
|
|
||||||
$url = parse_url($request->getURI());
|
|
||||||
$target = "/console{$url['path']}";
|
|
||||||
$params = $request->getParams();
|
|
||||||
if (!empty($params)) {
|
|
||||||
$target .= "?" . \http_build_query($params);
|
|
||||||
}
|
|
||||||
if ($url['fragment'] ?? false) {
|
|
||||||
$target .= "#{$url['fragment']}";
|
|
||||||
}
|
|
||||||
$response->redirect($target);
|
|
||||||
});
|
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Assistant;
|
||||||
|
|
||||||
|
use Appwrite\SDK\AuthType;
|
||||||
|
use Appwrite\SDK\ContentType;
|
||||||
|
use Appwrite\SDK\Method;
|
||||||
|
use Appwrite\SDK\Response as SDKResponse;
|
||||||
|
use Appwrite\Utopia\Response;
|
||||||
|
use Utopia\Platform\Action;
|
||||||
|
use Utopia\Platform\Scope\HTTP;
|
||||||
|
use Utopia\Validator\Text;
|
||||||
|
|
||||||
|
class Create extends Action
|
||||||
|
{
|
||||||
|
use HTTP;
|
||||||
|
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'createAssistantQuery';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setHttpMethod(Action::HTTP_REQUEST_METHOD_POST)
|
||||||
|
->setHttpPath('/v1/console/assistant')
|
||||||
|
->desc('Create assistant query')
|
||||||
|
->groups(['api', 'assistant'])
|
||||||
|
->label('scope', 'assistant.read')
|
||||||
|
->label('sdk', new Method(
|
||||||
|
namespace: 'assistant',
|
||||||
|
group: 'console',
|
||||||
|
name: 'chat',
|
||||||
|
description: '/docs/references/assistant/chat.md',
|
||||||
|
auth: [AuthType::ADMIN],
|
||||||
|
responses: [
|
||||||
|
new SDKResponse(
|
||||||
|
code: Response::STATUS_CODE_OK,
|
||||||
|
model: Response::MODEL_NONE,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
contentType: ContentType::TEXT
|
||||||
|
))
|
||||||
|
->label('abuse-limit', 15)
|
||||||
|
->label('abuse-key', 'userId:{userId}')
|
||||||
|
->param('prompt', '', new Text(2000), 'Prompt. A string containing questions asked to the AI assistant.')
|
||||||
|
->inject('response')
|
||||||
|
->callback($this->action(...));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function action(string $prompt, Response $response)
|
||||||
|
{
|
||||||
|
$ch = curl_init('http://appwrite-assistant:3003/v1/models/assistant/prompt');
|
||||||
|
$responseHeaders = [];
|
||||||
|
$query = json_encode(['prompt' => $prompt]);
|
||||||
|
$headers = ['accept: text/event-stream'];
|
||||||
|
$handleEvent = function ($ch, $data) use ($response) {
|
||||||
|
$response->chunk($data);
|
||||||
|
|
||||||
|
return \strlen($data);
|
||||||
|
};
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $handleEvent);
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
|
||||||
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||||
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
|
||||||
|
curl_setopt($ch, CURLOPT_TIMEOUT, 9000);
|
||||||
|
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) {
|
||||||
|
$len = strlen($header);
|
||||||
|
$header = explode(':', $header, 2);
|
||||||
|
|
||||||
|
if (count($header) < 2) { // ignore invalid headers
|
||||||
|
return $len;
|
||||||
|
}
|
||||||
|
|
||||||
|
$responseHeaders[strtolower(trim($header[0]))] = trim($header[1]);
|
||||||
|
|
||||||
|
return $len;
|
||||||
|
});
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
|
||||||
|
|
||||||
|
curl_exec($ch);
|
||||||
|
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
$response->chunk('', true);
|
||||||
|
}
|
||||||
|
}
|
||||||
28
src/Appwrite/Platform/Modules/Console/Http/Init/API.php
Normal file
28
src/Appwrite/Platform/Modules/Console/Http/Init/API.php
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Init;
|
||||||
|
|
||||||
|
use Appwrite\Extend\Exception;
|
||||||
|
use Utopia\Database\Document;
|
||||||
|
use Utopia\Platform\Action;
|
||||||
|
|
||||||
|
class API extends Action
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleAPI';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setType(Action::TYPE_INIT)
|
||||||
|
->groups(['console'])
|
||||||
|
->inject('project')
|
||||||
|
->callback(function (Document $project) {
|
||||||
|
if ($project->getId() !== 'console') {
|
||||||
|
throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
31
src/Appwrite/Platform/Modules/Console/Http/Init/Web.php
Normal file
31
src/Appwrite/Platform/Modules/Console/Http/Init/Web.php
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Init;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Request;
|
||||||
|
use Appwrite\Utopia\Response;
|
||||||
|
use Utopia\Platform\Action;
|
||||||
|
|
||||||
|
class Web extends Action
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleWeb';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setType(Action::TYPE_INIT)
|
||||||
|
->groups(['web'])
|
||||||
|
->inject('request')
|
||||||
|
->inject('response')
|
||||||
|
->callback(function (Request $request, Response $response) {
|
||||||
|
$response
|
||||||
|
->addHeader('X-Frame-Options', 'SAMEORIGIN') // Avoid console and homepage from showing in iframes
|
||||||
|
->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url=' . \urlencode($request->getURI()))
|
||||||
|
->addHeader('X-UA-Compatible', 'IE=Edge') // Deny IE browsers from going into quirks mode
|
||||||
|
;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Auth;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectAuth';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/auth/*';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Request;
|
||||||
|
use Appwrite\Utopia\Response;
|
||||||
|
use Utopia\Platform\Action;
|
||||||
|
use Utopia\Platform\Scope\HTTP;
|
||||||
|
|
||||||
|
abstract class Base extends Action
|
||||||
|
{
|
||||||
|
use HTTP;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTTP platform trait doesn't support multiple `aliases`
|
||||||
|
* like legacy controllers so we use independent redirects!
|
||||||
|
*
|
||||||
|
* This helps as a base and a small code logic for maintenance.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
abstract protected function getPath(): string;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET)
|
||||||
|
->setHttpPath($this->getPath())
|
||||||
|
->groups(['web'])
|
||||||
|
->label('permission', 'public')
|
||||||
|
->label('scope', 'home')
|
||||||
|
->inject('request')
|
||||||
|
->inject('response')
|
||||||
|
->callback($this->action(...));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function action(Request $request, Response $response): void
|
||||||
|
{
|
||||||
|
$url = parse_url($request->getURI());
|
||||||
|
$target = "/console{$url['path']}";
|
||||||
|
$params = $request->getParams();
|
||||||
|
if (!empty($params)) {
|
||||||
|
$target .= "?" . \http_build_query($params);
|
||||||
|
}
|
||||||
|
if ($url['fragment'] ?? false) {
|
||||||
|
$target .= "#{$url['fragment']}";
|
||||||
|
}
|
||||||
|
|
||||||
|
$response->redirect($target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Card;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectCard';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/card/*';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Invite;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectInvite';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/invite';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Login;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectLogin';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/login';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\MFA;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectMFA';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/mfa';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Recover;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectRecover';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/recover';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Register;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectRegister';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/register/*';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Redirects\Root;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Base;
|
||||||
|
|
||||||
|
class Get extends Base
|
||||||
|
{
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'consoleRedirectRoot';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPath(): string
|
||||||
|
{
|
||||||
|
return '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
93
src/Appwrite/Platform/Modules/Console/Http/Variables/Get.php
Normal file
93
src/Appwrite/Platform/Modules/Console/Http/Variables/Get.php
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Platform\Modules\Console\Http\Variables;
|
||||||
|
|
||||||
|
use Appwrite\SDK\AuthType;
|
||||||
|
use Appwrite\SDK\ContentType;
|
||||||
|
use Appwrite\SDK\Method;
|
||||||
|
use Appwrite\SDK\Response as SDKResponse;
|
||||||
|
use Appwrite\Utopia\Response;
|
||||||
|
use Utopia\Database\Document;
|
||||||
|
use Utopia\Domains\Domain;
|
||||||
|
use Utopia\Platform\Action;
|
||||||
|
use Utopia\Platform\Scope\HTTP;
|
||||||
|
use Utopia\System\System;
|
||||||
|
use Utopia\Validator\IP;
|
||||||
|
|
||||||
|
class Get extends Action
|
||||||
|
{
|
||||||
|
use HTTP;
|
||||||
|
|
||||||
|
public static function getName(): string
|
||||||
|
{
|
||||||
|
return 'getVariables';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET)
|
||||||
|
->setHttpPath('/v1/console/variables')
|
||||||
|
->desc('Get variables')
|
||||||
|
->groups(['api', 'projects'])
|
||||||
|
->label('scope', 'projects.read')
|
||||||
|
->label('sdk', new Method(
|
||||||
|
namespace: 'console',
|
||||||
|
group: 'console',
|
||||||
|
name: 'variables',
|
||||||
|
description: '/docs/references/console/variables.md',
|
||||||
|
auth: [AuthType::ADMIN],
|
||||||
|
responses: [
|
||||||
|
new SDKResponse(
|
||||||
|
code: Response::STATUS_CODE_OK,
|
||||||
|
model: Response::MODEL_CONSOLE_VARIABLES,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
contentType: ContentType::JSON
|
||||||
|
))
|
||||||
|
->inject('response')
|
||||||
|
->callback($this->action(...));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function action(Response $response)
|
||||||
|
{
|
||||||
|
$validator = new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME'));
|
||||||
|
$isCNAMEValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')) && $validator->isKnown() && !$validator->isTest();
|
||||||
|
|
||||||
|
$validator = new IP(IP::V4);
|
||||||
|
$isAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_A', '')) && ($validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_A')));
|
||||||
|
|
||||||
|
$validator = new IP(IP::V6);
|
||||||
|
$isAAAAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_AAAA', '')) && $validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_AAAA'));
|
||||||
|
|
||||||
|
$isDomainEnabled = $isAAAAValid || $isAValid || $isCNAMEValid;
|
||||||
|
|
||||||
|
$isVcsEnabled = !empty(System::getEnv('_APP_VCS_GITHUB_APP_NAME', ''))
|
||||||
|
&& !empty(System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY', ''))
|
||||||
|
&& !empty(System::getEnv('_APP_VCS_GITHUB_APP_ID', ''))
|
||||||
|
&& !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', ''))
|
||||||
|
&& !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', ''));
|
||||||
|
|
||||||
|
$isAssistantEnabled = !empty(System::getEnv('_APP_ASSISTANT_OPENAI_API_KEY', ''));
|
||||||
|
|
||||||
|
$variables = new Document([
|
||||||
|
'_APP_DOMAIN_TARGET_CNAME' => System::getEnv('_APP_DOMAIN_TARGET_CNAME'),
|
||||||
|
'_APP_DOMAIN_TARGET_AAAA' => System::getEnv('_APP_DOMAIN_TARGET_AAAA'),
|
||||||
|
'_APP_DOMAIN_TARGET_A' => System::getEnv('_APP_DOMAIN_TARGET_A'),
|
||||||
|
'_APP_DOMAIN_TARGET_CAA' => '0 issue "' . System::getEnv('_APP_DOMAIN_TARGET_CAA') . '"',
|
||||||
|
'_APP_STORAGE_LIMIT' => +System::getEnv('_APP_STORAGE_LIMIT'),
|
||||||
|
'_APP_COMPUTE_BUILD_TIMEOUT' => +System::getEnv('_APP_COMPUTE_BUILD_TIMEOUT'),
|
||||||
|
'_APP_COMPUTE_SIZE_LIMIT' => +System::getEnv('_APP_COMPUTE_SIZE_LIMIT'),
|
||||||
|
'_APP_USAGE_STATS' => System::getEnv('_APP_USAGE_STATS'),
|
||||||
|
'_APP_VCS_ENABLED' => $isVcsEnabled,
|
||||||
|
'_APP_DOMAIN_ENABLED' => $isDomainEnabled,
|
||||||
|
'_APP_ASSISTANT_ENABLED' => $isAssistantEnabled,
|
||||||
|
'_APP_DOMAIN_SITES' => System::getEnv('_APP_DOMAIN_SITES'),
|
||||||
|
'_APP_DOMAIN_FUNCTIONS' => System::getEnv('_APP_DOMAIN_FUNCTIONS'),
|
||||||
|
'_APP_OPTIONS_FORCE_HTTPS' => System::getEnv('_APP_OPTIONS_FORCE_HTTPS'),
|
||||||
|
'_APP_DOMAINS_NAMESERVERS' => System::getEnv('_APP_DOMAINS_NAMESERVERS'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response->dynamic($variables, Response::MODEL_CONSOLE_VARIABLES);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,19 @@
|
||||||
|
|
||||||
namespace Appwrite\Platform\Modules\Console\Services;
|
namespace Appwrite\Platform\Modules\Console\Services;
|
||||||
|
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Assistant\Create as CreateAssistantQuery;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Init\API;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Init\Web;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Auth\Get as RedirectAuth;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Card\Get as RedirectCard;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Invite\Get as RedirectInvite;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Login\Get as RedirectLogin;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\MFA\Get as RedirectMFA;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Recover\Get as RedirectRecover;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Register\Get as RedirectRegister;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Redirects\Root\Get as RedirectRoot;
|
||||||
use Appwrite\Platform\Modules\Console\Http\Resources\Get as GetResourceAvailability;
|
use Appwrite\Platform\Modules\Console\Http\Resources\Get as GetResourceAvailability;
|
||||||
|
use Appwrite\Platform\Modules\Console\Http\Variables\Get as GetVariables;
|
||||||
use Utopia\Platform\Service;
|
use Utopia\Platform\Service;
|
||||||
|
|
||||||
class Http extends Service
|
class Http extends Service
|
||||||
|
|
@ -10,7 +22,23 @@ class Http extends Service
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->type = Service::TYPE_HTTP;
|
$this->type = Service::TYPE_HTTP;
|
||||||
// Resources
|
|
||||||
|
// API and Web init hooks!
|
||||||
|
$this->addAction(API::getName(), new API());
|
||||||
|
$this->addAction(Web::getName(), new Web());
|
||||||
|
|
||||||
|
$this->addAction(GetVariables::getName(), new GetVariables());
|
||||||
|
$this->addAction(CreateAssistantQuery::getName(), new CreateAssistantQuery());
|
||||||
$this->addAction(GetResourceAvailability::getName(), new GetResourceAvailability());
|
$this->addAction(GetResourceAvailability::getName(), new GetResourceAvailability());
|
||||||
|
|
||||||
|
// web redirects to /console
|
||||||
|
$this->addAction(RedirectRoot::getName(), new RedirectRoot());
|
||||||
|
$this->addAction(RedirectAuth::getName(), new RedirectAuth());
|
||||||
|
$this->addAction(RedirectInvite::getName(), new RedirectInvite());
|
||||||
|
$this->addAction(RedirectLogin::getName(), new RedirectLogin());
|
||||||
|
$this->addAction(RedirectMFA::getName(), new RedirectMFA());
|
||||||
|
$this->addAction(RedirectCard::getName(), new RedirectCard());
|
||||||
|
$this->addAction(RedirectRecover::getName(), new RedirectRecover());
|
||||||
|
$this->addAction(RedirectRegister::getName(), new RedirectRegister());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue