appwrite/app/controllers/api/console.php

152 lines
5.8 KiB
PHP
Raw Normal View History

2023-03-31 15:14:59 +00:00
<?php
use Appwrite\Extend\Exception;
2025-01-17 04:31:39 +00:00
use Appwrite\SDK\AuthType;
use Appwrite\SDK\ContentType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
2023-03-31 15:14:59 +00:00
use Appwrite\Utopia\Response;
2024-10-08 07:54:40 +00:00
use Utopia\App;
2023-03-31 15:14:59 +00:00
use Utopia\Database\Document;
2025-04-08 14:48:50 +00:00
use Utopia\Domains\Domain;
2024-04-01 11:02:47 +00:00
use Utopia\System\System;
2025-04-08 14:48:50 +00:00
use Utopia\Validator\IP;
2024-10-08 07:54:40 +00:00
use Utopia\Validator\Text;
2023-03-31 15:14:59 +00:00
2024-10-08 07:54:40 +00:00
App::init()
2023-03-31 15:14:59 +00:00
->groups(['console'])
2023-03-31 20:48:34 +00:00
->inject('project')
2023-03-31 15:14:59 +00:00
->action(function (Document $project) {
if ($project->getId() !== 'console') {
throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN);
}
});
2024-10-08 07:54:40 +00:00
App::get('/v1/console/variables')
2023-08-01 15:26:48 +00:00
->desc('Get variables')
2023-03-31 15:14:59 +00:00
->groups(['api', 'projects'])
->label('scope', 'projects.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'console',
2025-03-31 05:48:17 +00:00
group: 'console',
2025-01-17 04:31:39 +00:00
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
))
2023-03-31 15:14:59 +00:00
->inject('response')
->action(function (Response $response) {
2025-04-08 14:48:50 +00:00
$validator = new Domain(System::getEnv('_APP_DOMAIN'));
$isDomainValid = !empty(System::getEnv('_APP_DOMAIN', '')) && $validator->isKnown() && !$validator->isTest();
$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 = $isDomainValid && (
$isAAAAValid || $isAValid || $isCNAMEValid
);
2023-03-31 15:14:59 +00:00
2024-04-01 11:02:47 +00:00
$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', ''));
2023-08-20 08:10:42 +00:00
2024-04-01 11:02:47 +00:00
$isAssistantEnabled = !empty(System::getEnv('_APP_ASSISTANT_OPENAI_API_KEY', ''));
2023-03-31 15:14:59 +00:00
$variables = new Document([
2025-04-08 14:48:50 +00:00
'_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'),
2025-08-05 11:44:06 +00:00
// Combine CAA domain with most common flags and tag (no parameters)
'_APP_DOMAIN_TARGET_CAA' => '0 issue "' . System::getEnv('_APP_DOMAIN_TARGET_CAA') . '"',
2024-04-01 11:02:47 +00:00
'_APP_STORAGE_LIMIT' => +System::getEnv('_APP_STORAGE_LIMIT'),
'_APP_COMPUTE_SIZE_LIMIT' => +System::getEnv('_APP_COMPUTE_SIZE_LIMIT'),
2024-04-01 11:02:47 +00:00
'_APP_USAGE_STATS' => System::getEnv('_APP_USAGE_STATS'),
2023-08-20 08:10:42 +00:00
'_APP_VCS_ENABLED' => $isVcsEnabled,
2023-08-28 14:08:50 +00:00
'_APP_DOMAIN_ENABLED' => $isDomainEnabled,
'_APP_ASSISTANT_ENABLED' => $isAssistantEnabled,
'_APP_DOMAIN_SITES' => System::getEnv('_APP_DOMAIN_SITES'),
2025-03-28 10:38:45 +00:00
'_APP_DOMAIN_FUNCTIONS' => System::getEnv('_APP_DOMAIN_FUNCTIONS'),
2025-02-22 17:32:10 +00:00
'_APP_OPTIONS_FORCE_HTTPS' => System::getEnv('_APP_OPTIONS_FORCE_HTTPS'),
'_APP_DOMAINS_NAMESERVERS' => System::getEnv('_APP_DOMAINS_NAMESERVERS'),
2023-03-31 15:14:59 +00:00
]);
$response->dynamic($variables, Response::MODEL_CONSOLE_VARIABLES);
});
2024-10-08 07:54:40 +00:00
App::post('/v1/console/assistant')
->desc('Create assistant query')
->groups(['api', 'assistant'])
2023-08-30 18:44:33 +00:00
->label('scope', 'assistant.read')
2025-01-17 04:31:39 +00:00
->label('sdk', new Method(
namespace: 'assistant',
2025-03-31 05:48:17 +00:00
group: 'console',
2025-01-17 04:31:39 +00:00
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
))
2023-08-04 13:16:57 +00:00
->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')
2024-12-12 19:04:31 +00:00
->action(function (string $prompt, Response $response) {
2024-12-16 12:36:02 +00:00
$ch = curl_init('http://appwrite-assistant:3003/v1/models/assistant/prompt');
$responseHeaders = [];
2024-12-12 19:04:31 +00:00
$query = json_encode(['prompt' => $prompt]);
2023-08-04 13:08:59 +00:00
$headers = ['accept: text/event-stream'];
2023-08-04 02:17:02 +00:00
$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);
2025-01-17 04:39:16 +00:00
});