diff --git a/app/controllers/api/project.php b/app/controllers/api/project.php index bc4e6f158a..cee73728e5 100644 --- a/app/controllers/api/project.php +++ b/app/controllers/api/project.php @@ -3,10 +3,13 @@ use Appwrite\Extend\Exception; use Appwrite\Utopia\Response; use Utopia\App; +use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; -use Utopia\Database\DateTime; +use Utopia\Database\Helpers\ID; +use Utopia\Database\Helpers\Permission; +use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; @@ -115,6 +118,115 @@ App::get('/v1/project/usage') $response->dynamic($usage, Response::MODEL_USAGE_PROJECT); }); +// Variables + +App::post('/v1/project/variables') + ->desc('Create Variable') + ->groups(['api']) + ->label('scope', 'projects.write') + ->label('audits.event', 'variable.create') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'project') + ->label('sdk.method', 'createVariable') + ->label('sdk.description', '/docs/references/project/create-variable.md') + ->label('sdk.response.code', Response::STATUS_CODE_CREATED) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_VARIABLE) + ->param('key', null, new Text(Database::LENGTH_KEY), 'Variable key. Max length: ' . Database::LENGTH_KEY . ' chars.', false) + ->param('value', null, new Text(8192, 0), 'Variable value. Max length: 8192 chars.', false) + ->inject('project') + ->inject('response') + ->inject('dbForProject') + ->inject('dbForConsole') + ->action(function (string $key, string $value, Document $project, Response $response, Database $dbForProject, Database $dbForConsole) { + $variableId = ID::unique(); + + $variable = new Document([ + '$id' => $variableId, + '$permissions' => [ + Permission::read(Role::any()), + Permission::update(Role::any()), + Permission::delete(Role::any()), + ], + 'resourceInternalId' => '', + 'resourceId' => '', + 'resourceType' => 'project', + 'key' => $key, + 'value' => $value, + 'search' => implode(' ', [$variableId, $key, 'project']), + ]); + + try { + $variable = $dbForProject->createDocument('variables', $variable); + } catch (DuplicateException $th) { + throw new Exception(Exception::VARIABLE_ALREADY_EXISTS); + } + $dbForConsole->deleteCachedDocument('projects', $project->getId()); + + $functions = $dbForProject->find('functions', [ + Query::limit(APP_LIMIT_SUBQUERY) + ]); + + foreach ($functions as $function) { + $dbForProject->updateDocument('functions', $function->getId(), $function->setAttribute('live', false)); + } + + $dbForProject->deleteCachedDocument('projects', $project->getId()); + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->dynamic($variable, Response::MODEL_VARIABLE); + }); + +App::get('/v1/project/variables') + ->desc('List Variables') + ->groups(['api']) + ->label('scope', 'projects.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'project') + ->label('sdk.method', 'listVariables') + ->label('sdk.description', '/docs/references/project/list-variables.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_VARIABLE_LIST) + ->inject('response') + ->inject('dbForProject') + ->action(function (Response $response, Database $dbForProject) { + $variables = $dbForProject->find('variables', [ + Query::equal('resourceType', ['project']), + Query::limit(APP_LIMIT_SUBQUERY) + ]); + + $response->dynamic(new Document([ + 'variables' => $variables, + 'total' => \count($variables), + ]), Response::MODEL_VARIABLE_LIST); + }); + +App::get('/v1/project/variables/:variableId') + ->desc('Get Variable') + ->groups(['api']) + ->label('scope', 'projects.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'project') + ->label('sdk.method', 'getVariable') + ->label('sdk.description', '/docs/references/project/get-variable.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_VARIABLE) + ->param('variableId', '', new UID(), 'Variable unique ID.', false) + ->inject('response') + ->inject('project') + ->inject('dbForProject') + ->action(function (string $variableId, Response $response, Document $project, Database $dbForProject) { + $variable = $dbForProject->getDocument('variables', $variableId); + if ($variable === false || $variable->isEmpty() || $variable->getAttribute('resourceType') !== 'project') { + throw new Exception(Exception::VARIABLE_NOT_FOUND); + } + + $response->dynamic($variable, Response::MODEL_VARIABLE); + }); + App::put('/v1/project/variables/:variableId') ->desc('Update Variable') ->groups(['api'])