1
0
Fork 0
mirror of synced 2024-06-02 19:04:49 +12:00
appwrite/app/controllers/api/projects.php

1658 lines
67 KiB
PHP
Raw Normal View History

2019-12-15 08:33:29 +13:00
<?php
use Appwrite\Auth\Auth;
2020-06-12 07:36:10 +12:00
use Appwrite\Network\Validator\CNAME;
use Appwrite\Network\Validator\Domain as DomainValidator;
2021-06-07 17:17:29 +12:00
use Appwrite\Network\Validator\URL;
use Appwrite\Task\Validator\Cron;
2020-08-15 09:56:50 +12:00
use Appwrite\Utopia\Response;
2019-12-18 23:24:54 +13:00
use Cron\CronExpression;
2021-06-07 17:17:29 +12:00
use Utopia\App;
use Utopia\Config\Config;
2021-05-16 10:41:42 +12:00
use Utopia\Database\Document;
2021-05-27 22:09:14 +12:00
use Utopia\Database\Query;
2021-05-16 10:41:42 +12:00
use Utopia\Database\Validator\UID;
2021-06-07 17:17:29 +12:00
use Utopia\Domains\Domain;
use Utopia\Exception;
use Utopia\Validator\ArrayList;
use Utopia\Validator\Boolean;
use Utopia\Validator\Integer;
use Utopia\Validator\Range;
use Utopia\Validator\Text;
use Utopia\Validator\WhiteList;
2021-06-07 17:52:40 +12:00
use Utopia\Audit\Audit;
use Utopia\Abuse\Adapters\TimeLimit;
2019-12-15 08:33:29 +13:00
2020-06-29 05:31:21 +12:00
App::post('/v1/projects')
2020-02-01 11:34:07 +13:00
->desc('Create Project')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'create')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
2020-09-11 02:40:14 +12:00
->param('name', null, new Text(128), 'Project name. Max length: 128 chars.')
->param('teamId', '', new UID(), 'Team unique ID.')
->param('description', '', new Text(256), 'Project description. Max length: 256 chars.', true)
->param('logo', '', new Text(1024), 'Project logo.', true)
->param('url', '', new URL(), 'Project URL.', true)
->param('legalName', '', new Text(256), 'Project legal Name. Max length: 256 chars.', true)
->param('legalCountry', '', new Text(256), 'Project legal Country. Max length: 256 chars.', true)
->param('legalState', '', new Text(256), 'Project legal State. Max length: 256 chars.', true)
->param('legalCity', '', new Text(256), 'Project legal City. Max length: 256 chars.', true)
->param('legalAddress', '', new Text(256), 'Project legal Address. Max length: 256 chars.', true)
->param('legalTaxId', '', new Text(256), 'Project legal Tax ID. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
2021-05-03 20:28:31 +12:00
->inject('dbForInternal')
->inject('dbForExternal')
2021-06-12 06:23:41 +12:00
->inject('consoleDB')
->action(function ($name, $teamId, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId, $response, $dbForConsole, $dbForInternal, $dbForExternal, $consoleDB) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2021-05-03 20:28:31 +12:00
/** @var Utopia\Database\Database $dbForInternal */
/** @var Utopia\Database\Database $dbForExternal */
2021-06-12 06:23:41 +12:00
/** @var Appwrite\Database\Database $consoleDB */
2020-02-01 11:34:07 +13:00
2021-06-07 05:54:01 +12:00
$team = $dbForConsole->getDocument('teams', $teamId);
2020-02-01 11:34:07 +13:00
2021-05-07 10:31:05 +12:00
if ($team->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Team not found', 404);
}
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->createDocument('projects', new Document([
2021-06-07 17:17:29 +12:00
'$read' => ['team:' . $teamId],
'$write' => ['team:' . $teamId . '/owner', 'team:' . $teamId . '/developer'],
'teamId' => $team->getId(),
2021-05-16 10:41:42 +12:00
'name' => $name,
'description' => $description,
'logo' => $logo,
'url' => $url,
'version' => APP_VERSION_STABLE,
2021-05-16 10:41:42 +12:00
'legalName' => $legalName,
'legalCountry' => $legalCountry,
'legalState' => $legalState,
'legalCity' => $legalCity,
'legalAddress' => $legalAddress,
'legalTaxId' => $legalTaxId,
'platforms' => [],
'webhooks' => [],
'keys' => [],
'tasks' => [],
'domains' => [],
2021-05-16 21:18:34 +12:00
'usersAuthEmailPassword' => true,
'usersAuthAnonymous' => true,
'usersAuthInvites' => true,
'usersAuthJWT' => true,
'usersAuthPhone' => true,
2021-05-16 10:41:42 +12:00
]));
2020-07-01 03:46:42 +12:00
2021-05-03 20:28:31 +12:00
$collections = Config::getParam('collections2', []); /** @var array $collections */
2021-06-07 17:17:29 +12:00
$dbForInternal->setNamespace('project_' . $project->getId() . '_internal');
2021-05-03 20:28:31 +12:00
$dbForInternal->create();
2021-06-07 17:17:29 +12:00
$dbForExternal->setNamespace('project_' . $project->getId() . '_external');
2021-05-03 20:28:31 +12:00
$dbForExternal->create();
2021-07-05 00:23:58 +12:00
$audit = new Audit($dbForInternal);
2021-06-07 17:52:40 +12:00
$audit->setup();
2021-07-05 00:23:58 +12:00
$adapter = new TimeLimit("", 0, 1, $dbForInternal);
2021-06-07 17:52:40 +12:00
$adapter->setup();
2021-05-03 20:28:31 +12:00
foreach ($collections as $key => $collection) {
2021-07-05 00:05:46 +12:00
$attributes = [];
$indexes = [];
foreach ($collection['attributes'] as $attribute) {
$attributes[] = new Document([
'$id' => $attribute['$id'],
'type' => $attribute['type'],
'size' => $attribute['size'],
'required' => $attribute['required'],
'signed' => $attribute['signed'],
'array' => $attribute['array'],
'filters' => $attribute['filters'],
]);
2021-05-03 20:28:31 +12:00
}
2021-07-05 00:05:46 +12:00
foreach ($collection['indexes'] as $index) {
$indexes[] = new Document([
'$id' => $index['$id'],
'type' => $index['type'],
'attributes' => $index['attributes'],
'lengths' => $index['lengths'],
'orders' => $index['orders'],
]);
2021-05-03 20:28:31 +12:00
}
2021-07-05 00:05:46 +12:00
2021-07-05 00:23:58 +12:00
$dbForInternal->createCollection($key, $attributes, $indexes);
2021-05-03 20:28:31 +12:00
}
2021-06-12 06:23:41 +12:00
$consoleDB->createNamespace($project->getId());
2021-05-16 10:41:42 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects')
2019-12-15 08:33:29 +13:00
->desc('List Projects')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-15 08:33:29 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-15 08:33:29 +13:00
->label('sdk.namespace', 'projects')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'list')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT_LIST)
2020-09-11 02:40:14 +12:00
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('limit', 25, new Range(0, 100), 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
->param('offset', 0, new Range(0, 2000), 'Results offset. The default value is 0. Use this param to manage pagination.', true)
->param('orderType', 'ASC', new WhiteList(['ASC', 'DESC'], true), 'Order result by ASC or DESC order.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($search, $limit, $offset, $orderType, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-07-09 03:07:52 +12:00
2021-05-27 22:09:14 +12:00
$queries = ($search) ? [new Query('name', Query::TYPE_SEARCH, [$search])] : [];
2021-06-13 02:33:23 +12:00
$results = $dbForConsole->find('projects', $queries, $limit, $offset, ['_id'], [$orderType]);
2021-05-27 22:09:14 +12:00
$sum = $dbForConsole->count('projects', $queries, APP_LIMIT_COUNT);
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'projects' => $results,
2021-05-16 10:41:42 +12:00
'sum' => $sum,
2020-09-12 20:07:28 +12:00
]), Response::MODEL_PROJECT_LIST);
2020-12-27 05:33:36 +13:00
});
2019-12-15 08:33:29 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId')
2019-12-15 08:33:29 +13:00
->desc('Get Project')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-15 08:33:29 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-15 08:33:29 +13:00
->label('sdk.namespace', 'projects')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'get')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-15 08:33:29 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
2020-12-27 05:33:36 +13:00
});
2019-12-15 08:33:29 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/usage')
2019-12-15 08:33:29 +13:00
->desc('Get Project')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-15 08:33:29 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-15 08:33:29 +13:00
->label('sdk.namespace', 'projects')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'getUsage')
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
->param('range', '30d', new WhiteList(['24h', '7d', '30d', '90d'], true), 'Date range.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
2020-12-27 05:33:36 +13:00
->inject('projectDB')
->inject('register')
2021-05-16 10:41:42 +12:00
->action(function ($projectId, $range, $response, $dbForConsole, $projectDB, $register) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-07-01 03:46:42 +12:00
/** @var Appwrite\Database\Database $projectDB */
/** @var Utopia\Registry\Registry $register */
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-07-01 03:46:42 +12:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-15 08:33:29 +13:00
2021-06-07 17:17:29 +12:00
if (App::getEnv('_APP_USAGE_STATS', 'enabled') == 'enabled') {
2020-07-01 03:46:42 +12:00
$period = [
'24h' => [
'start' => DateTime::createFromFormat('U', \strtotime('-24 hours')),
'end' => DateTime::createFromFormat('U', \strtotime('+1 hour')),
'group' => '30m',
],
'7d' => [
'start' => DateTime::createFromFormat('U', \strtotime('-7 days')),
'end' => DateTime::createFromFormat('U', \strtotime('now')),
'group' => '1d',
],
'30d' => [
'start' => DateTime::createFromFormat('U', \strtotime('-30 days')),
'end' => DateTime::createFromFormat('U', \strtotime('now')),
'group' => '1d',
],
'90d' => [
'start' => DateTime::createFromFormat('U', \strtotime('-90 days')),
'end' => DateTime::createFromFormat('U', \strtotime('now')),
'group' => '1d',
],
];
2021-06-07 17:17:29 +12:00
$client = $register->get('influxdb');
2021-06-07 17:17:29 +12:00
$requests = [];
$network = [];
$functions = [];
2021-06-07 17:17:29 +12:00
if ($client) {
$start = $period[$range]['start']->format(DateTime::RFC3339);
$end = $period[$range]['end']->format(DateTime::RFC3339);
$database = $client->selectDB('telegraf');
2021-06-07 17:17:29 +12:00
// Requests
2021-06-07 17:17:29 +12:00
$result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_requests_all" WHERE time > \'' . $start . '\' AND time < \'' . $end . '\' AND "metric_type"=\'counter\' AND "project"=\'' . $project->getId() . '\' GROUP BY time(' . $period[$range]['group'] . ') FILL(null)');
$points = $result->getPoints();
2021-06-07 17:17:29 +12:00
foreach ($points as $point) {
$requests[] = [
'value' => (!empty($point['value'])) ? $point['value'] : 0,
'date' => \strtotime($point['time']),
];
}
2021-06-07 17:17:29 +12:00
// Network
2021-06-07 17:17:29 +12:00
$result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_network_all" WHERE time > \'' . $start . '\' AND time < \'' . $end . '\' AND "metric_type"=\'counter\' AND "project"=\'' . $project->getId() . '\' GROUP BY time(' . $period[$range]['group'] . ') FILL(null)');
$points = $result->getPoints();
2021-06-07 17:17:29 +12:00
foreach ($points as $point) {
$network[] = [
'value' => (!empty($point['value'])) ? $point['value'] : 0,
'date' => \strtotime($point['time']),
];
}
2021-06-07 17:17:29 +12:00
// Functions
2021-06-07 17:17:29 +12:00
$result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_executions_all" WHERE time > \'' . $start . '\' AND time < \'' . $end . '\' AND "metric_type"=\'counter\' AND "project"=\'' . $project->getId() . '\' GROUP BY time(' . $period[$range]['group'] . ') FILL(null)');
$points = $result->getPoints();
2021-06-07 17:17:29 +12:00
foreach ($points as $point) {
$functions[] = [
'value' => (!empty($point['value'])) ? $point['value'] : 0,
'date' => \strtotime($point['time']),
];
}
2020-07-21 22:33:23 +12:00
}
} else {
$requests = [];
$network = [];
$functions = [];
2020-07-01 03:46:42 +12:00
}
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
// Users
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
$projectDB->getCollection([
'limit' => 0,
'offset' => 0,
'filters' => [
2021-06-07 17:17:29 +12:00
'$collection=users',
2020-07-01 03:46:42 +12:00
],
]);
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
$usersTotal = $projectDB->getSum();
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
// Documents
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
$collections = $projectDB->getCollection([
'limit' => 100,
'offset' => 0,
'filters' => [
2021-05-16 10:41:42 +12:00
'$collection=collections',
2020-07-01 03:46:42 +12:00
],
]);
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
$collectionsTotal = $projectDB->getSum();
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
$documents = [];
2019-12-15 08:33:29 +13:00
2020-07-01 03:46:42 +12:00
foreach ($collections as $collection) {
$result = $projectDB->getCollection([
'limit' => 0,
2019-12-15 08:33:29 +13:00
'offset' => 0,
'filters' => [
2021-06-07 17:17:29 +12:00
'$collection=' . $collection['$id'],
2019-12-15 08:33:29 +13:00
],
]);
2020-07-01 03:46:42 +12:00
$documents[] = ['name' => $collection['name'], 'total' => $projectDB->getSum()];
2019-12-15 08:33:29 +13:00
}
2020-07-01 03:46:42 +12:00
// Tasks
$tasksTotal = \count($project->getAttribute('tasks', []));
$response->json([
2020-07-24 02:59:44 +12:00
'range' => $range,
2020-07-01 03:46:42 +12:00
'requests' => [
'data' => $requests,
'total' => \array_sum(\array_map(function ($item) {
return $item['value'];
}, $requests)),
],
'network' => [
'data' => \array_map(function ($value) {return ['value' => \round($value['value'] / 1000000, 2), 'date' => $value['date']];}, $network), // convert bytes to mb
2020-07-01 03:46:42 +12:00
'total' => \array_sum(\array_map(function ($item) {
return $item['value'];
}, $network)),
],
2020-07-21 22:33:23 +12:00
'functions' => [
'data' => $functions,
'total' => \array_sum(\array_map(function ($item) {
return $item['value'];
}, $functions)),
],
2020-07-01 03:46:42 +12:00
'collections' => [
'data' => $collections,
'total' => $collectionsTotal,
],
'documents' => [
'data' => $documents,
'total' => \array_sum(\array_map(function ($item) {
return $item['total'];
}, $documents)),
],
'users' => [
'data' => [],
'total' => $usersTotal,
],
'tasks' => [
'data' => [],
'total' => $tasksTotal,
],
'storage' => [
'total' => $projectDB->getCount(
[
'attribute' => 'sizeOriginal',
2020-07-01 03:46:42 +12:00
'filters' => [
2021-05-16 10:41:42 +12:00
'$collection=files',
2020-07-01 03:46:42 +12:00
],
]
2021-06-07 17:17:29 +12:00
) +
$projectDB->getCount(
[
2020-08-08 22:41:17 +12:00
'attribute' => 'size',
'filters' => [
2021-05-16 10:41:42 +12:00
'$collection=tags',
],
]
2020-07-01 03:46:42 +12:00
),
],
]);
2020-12-27 05:33:36 +13:00
});
2019-12-15 08:33:29 +13:00
2020-06-29 05:31:21 +12:00
App::patch('/v1/projects/:projectId')
2019-12-15 08:33:29 +13:00
->desc('Update Project')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-15 08:33:29 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-15 08:33:29 +13:00
->label('sdk.namespace', 'projects')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'update')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
->param('name', null, new Text(128), 'Project name. Max length: 128 chars.')
->param('description', '', new Text(256), 'Project description. Max length: 256 chars.', true)
->param('logo', '', new Text(1024), 'Project logo.', true)
->param('url', '', new URL(), 'Project URL.', true)
->param('legalName', '', new Text(256), 'Project legal name. Max length: 256 chars.', true)
->param('legalCountry', '', new Text(256), 'Project legal country. Max length: 256 chars.', true)
->param('legalState', '', new Text(256), 'Project legal state. Max length: 256 chars.', true)
->param('legalCity', '', new Text(256), 'Project legal city. Max length: 256 chars.', true)
->param('legalAddress', '', new Text(256), 'Project legal address. Max length: 256 chars.', true)
->param('legalTaxId', '', new Text(256), 'Project legal tax ID. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $name, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('name', $name)
->setAttribute('description', $description)
->setAttribute('logo', $logo)
->setAttribute('url', $url)
->setAttribute('legalName', $legalName)
->setAttribute('legalCountry', $legalCountry)
->setAttribute('legalState', $legalState)
->setAttribute('legalCity', $legalCity)
->setAttribute('legalAddress', $legalAddress)
->setAttribute('legalTaxId', $legalTaxId)
2021-05-16 10:41:42 +12:00
);
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
2020-12-27 05:33:36 +13:00
});
2019-12-15 08:33:29 +13:00
2021-07-29 22:28:17 +12:00
App::patch('/v1/projects/:projectId/service')
->desc('Update service status')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'projects')
->label('sdk.method', 'serviceStatus')
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
->param('projectId', '', new UID(), 'Project unique ID.')
->param('service', '', new WhiteList(['functions','webhooks', 'avatars','health','locale','storage','teams'],true), 'Service name.')
->param('status', '', new Boolean(), 'Status of the service', true)
->inject('response')
->inject('dbForConsole')
->action(function ($projectId, $service, $status, $response, $dbForConsole) {
/** @var Appwrite\Utopia\Response $response */
/** @var Utopia\Database\Database $dbForConsole */
$project = $dbForConsole->getDocument('projects', $projectId);
2021-07-29 22:56:25 +12:00
if ($project->isEmpty()) {
2021-07-29 22:28:17 +12:00
throw new Exception('Project not found', 404);
}
2021-07-29 22:56:25 +12:00
$services = $project->getAttribute('statusForServices', []);
2021-07-29 22:28:17 +12:00
$services = array_merge($services, [
$service => $status
]);
2021-07-29 22:56:25 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project->setAttribute('statusForServices', $services));
2021-07-29 22:28:17 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
});
2020-06-29 05:31:21 +12:00
App::patch('/v1/projects/:projectId/oauth2')
2020-02-17 00:41:03 +13:00
->desc('Update Project OAuth2')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-15 08:33:29 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-15 08:33:29 +13:00
->label('sdk.namespace', 'projects')
2020-02-17 00:41:03 +13:00
->label('sdk.method', 'updateOAuth2')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('providers')), true), 'Provider Name', false)
->param('appId', '', new Text(256), 'Provider app ID. Max length: 256 chars.', true)
->param('secret', '', new text(512), 'Provider secret key. Max length: 512 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $provider, $appId, $secret, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('usersOauth2' . \ucfirst($provider) . 'Appid', $appId)
->setAttribute('usersOauth2' . \ucfirst($provider) . 'Secret', $secret)
2021-05-16 10:41:42 +12:00
);
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
2020-12-27 05:33:36 +13:00
});
2019-12-15 08:33:29 +13:00
2021-03-01 04:00:27 +13:00
App::patch('/v1/projects/:projectId/auth/limit')
->desc('Update Project users limit')
2021-03-01 00:40:59 +13:00
->groups(['api', 'projects'])
->label('scope', 'projects.write')
2021-04-23 18:31:22 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2021-03-01 00:40:59 +13:00
->label('sdk.namespace', 'projects')
2021-03-01 04:00:27 +13:00
->label('sdk.method', 'updateAuthLimit')
2021-03-01 00:40:59 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
->param('projectId', '', new UID(), 'Project unique ID.')
2021-03-01 04:00:27 +13:00
->param('limit', false, new Integer(true), 'Set the max number of users allowed in this project. Use 0 for unlimited.')
2021-03-01 00:40:59 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $limit, $response, $dbForConsole) {
2021-03-01 00:40:59 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2021-03-01 00:40:59 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2021-03-01 00:40:59 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2021-03-01 00:40:59 +13:00
throw new Exception('Project not found', 404);
}
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('usersAuthLimit', $limit)
2021-05-16 10:41:42 +12:00
);
2021-03-01 00:40:59 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
2021-03-01 00:40:59 +13:00
});
2021-03-01 04:00:27 +13:00
App::patch('/v1/projects/:projectId/auth/:method')
->desc('Update Project auth method status. Use this endpoint to enable or disable a given auth method for this project.')
2021-03-01 00:40:59 +13:00
->groups(['api', 'projects'])
->label('scope', 'projects.write')
2021-04-23 18:31:22 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2021-03-01 00:40:59 +13:00
->label('sdk.namespace', 'projects')
2021-03-01 04:00:27 +13:00
->label('sdk.method', 'updateAuthStatus')
2021-03-01 00:40:59 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
->param('projectId', '', new UID(), 'Project unique ID.')
2021-06-07 17:17:29 +12:00
->param('method', '', new WhiteList(\array_keys(Config::getParam('auth')), true), 'Auth Method. Possible values: ' . implode(',', \array_keys(Config::getParam('auth'))), false)
2021-03-01 04:00:27 +13:00
->param('status', false, new Boolean(true), 'Set the status of this auth method.')
2021-03-01 00:40:59 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $method, $status, $response, $dbForConsole) {
2021-03-01 00:40:59 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2021-03-01 00:40:59 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2021-03-01 04:00:27 +13:00
$auth = Config::getParam('auth')[$method] ?? [];
$authKey = $auth['key'] ?? '';
$status = ($status === '1' || $status === 'true' || $status === 1 || $status === true);
2021-03-01 00:40:59 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2021-03-01 00:40:59 +13:00
throw new Exception('Project not found', 404);
}
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute($authKey, $status)
2021-05-16 10:41:42 +12:00
);
2021-03-01 00:40:59 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic($project, Response::MODEL_PROJECT);
2021-03-01 00:40:59 +13:00
});
2020-06-29 05:31:21 +12:00
App::delete('/v1/projects/:projectId')
2019-12-15 08:33:29 +13:00
->desc('Delete Project')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-15 08:33:29 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-15 08:33:29 +13:00
->label('sdk.namespace', 'projects')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'delete')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
->param('password', '', new UID(), 'Your user password for confirmation. Must be between 6 to 32 chars.')
2020-12-27 05:33:36 +13:00
->inject('response')
->inject('user')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
2020-12-27 05:33:36 +13:00
->inject('deletes')
2021-05-16 10:41:42 +12:00
->action(function ($projectId, $password, $response, $user, $dbForConsole, $deletes) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2020-07-01 03:46:42 +12:00
/** @var Appwrite\Database\Document $user */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-07-01 03:46:42 +12:00
/** @var Appwrite\Event\Event $deletes */
if (!Auth::passwordVerify($password, $user->getAttribute('password'))) { // Double check user password
throw new Exception('Invalid credentials', 401);
}
2020-01-31 12:50:17 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-15 08:33:29 +13:00
2020-12-19 00:08:58 +13:00
$deletes
2020-12-19 03:05:15 +13:00
->setParam('type', DELETE_TYPE_DOCUMENT)
2021-05-16 10:41:42 +12:00
->setParam('document', $project)
2020-12-19 00:08:58 +13:00
;
2021-06-07 17:17:29 +12:00
2021-05-16 10:41:42 +12:00
if (!$dbForConsole->deleteDocument('teams', $project->getAttribute('teamId', null))) {
2020-07-01 03:46:42 +12:00
throw new Exception('Failed to remove project team from DB', 500);
}
2019-12-15 08:33:29 +13:00
2021-05-16 10:41:42 +12:00
if (!$dbForConsole->deleteDocument('projects', $projectId)) {
2020-07-01 03:46:42 +12:00
throw new Exception('Failed to remove project from DB', 500);
2019-12-18 23:24:54 +13:00
}
2020-07-01 03:46:42 +12:00
$response->noContent();
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
// Webhooks
2020-06-29 05:31:21 +12:00
App::post('/v1/projects/:projectId/webhooks')
2020-02-01 11:34:07 +13:00
->desc('Create Webhook')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createWebhook')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_WEBHOOK)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('name', null, new Text(128), 'Webhook name. Max length: 128 chars.')
->param('events', null, new ArrayList(new WhiteList(array_keys(Config::getParam('events'), true), true)), 'Events list.')
->param('url', null, new URL(), 'Webhook URL.')
->param('security', false, new Boolean(true), 'Certificate verification, false for disabled or true for enabled.')
->param('httpUser', '', new Text(256), 'Webhook HTTP user. Max length: 256 chars.', true)
->param('httpPass', '', new Text(256), 'Webhook HTTP password. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $name, $events, $url, $security, $httpUser, $httpPass, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-01 11:34:07 +13:00
2020-07-01 03:46:42 +12:00
$security = ($security === '1' || $security === 'true' || $security === 1 || $security === true);
2021-05-16 10:41:42 +12:00
$webhook = new Document([
'$id' => $dbForConsole->getId(),
2020-07-01 03:46:42 +12:00
'name' => $name,
'events' => $events,
'url' => $url,
2020-07-09 21:11:42 +12:00
'security' => $security,
2020-07-01 03:46:42 +12:00
'httpUser' => $httpUser,
'httpPass' => $httpPass,
]);
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('webhooks', $webhook, Document::SET_TYPE_APPEND)
2021-05-16 10:41:42 +12:00
);
2020-07-01 03:46:42 +12:00
2021-05-27 22:09:14 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($webhook, Response::MODEL_WEBHOOK);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/webhooks')
2019-12-18 23:24:54 +13:00
->desc('List Webhooks')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listWebhooks')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_WEBHOOK_LIST)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
$webhooks = $project->getAttribute('webhooks', []);
2019-12-18 23:24:54 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'webhooks' => $webhooks,
2020-08-15 09:56:50 +12:00
'sum' => count($webhooks),
]), Response::MODEL_WEBHOOK_LIST);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/webhooks/:webhookId')
2019-12-18 23:24:54 +13:00
->desc('Get Webhook')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getWebhook')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_WEBHOOK)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('webhookId', null, new UID(), 'Webhook unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $webhookId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$webhook = $project->find('$id', $webhookId, 'webhooks');
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
if (empty($webhook) || !$webhook instanceof Document) {
throw new Exception('Webhook not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic($webhook, Response::MODEL_WEBHOOK);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::put('/v1/projects/:projectId/webhooks/:webhookId')
2019-12-18 23:24:54 +13:00
->desc('Update Webhook')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateWebhook')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_WEBHOOK)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('webhookId', null, new UID(), 'Webhook unique ID.')
->param('name', null, new Text(128), 'Webhook name. Max length: 128 chars.')
->param('events', null, new ArrayList(new WhiteList(array_keys(Config::getParam('events'), true), true)), 'Events list.')
->param('url', null, new URL(), 'Webhook URL.')
->param('security', false, new Boolean(true), 'Certificate verification, false for disabled or true for enabled.')
->param('httpUser', '', new Text(256), 'Webhook HTTP user. Max length: 256 chars.', true)
->param('httpPass', '', new Text(256), 'Webhook HTTP password. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $webhookId, $name, $events, $url, $security, $httpUser, $httpPass, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
$security = ($security === '1' || $security === 'true' || $security === 1 || $security === true);
2021-05-16 10:41:42 +12:00
$webhook = $project->find('$id', $webhookId, 'webhooks');
2020-07-01 03:46:42 +12:00
if (empty($webhook) || !$webhook instanceof Document) {
throw new Exception('Webhook not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project->findAndReplace('$id', $webhook->getId(), $webhook
2021-06-07 17:17:29 +12:00
->setAttribute('name', $name)
->setAttribute('events', $events)
->setAttribute('url', $url)
->setAttribute('security', $security)
->setAttribute('httpUser', $httpUser)
->setAttribute('httpPass', $httpPass)
, 'webhooks');
2020-07-01 03:46:42 +12:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2021-06-07 17:17:29 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($webhook, Response::MODEL_WEBHOOK);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::delete('/v1/projects/:projectId/webhooks/:webhookId')
2019-12-18 23:24:54 +13:00
->desc('Delete Webhook')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteWebhook')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('webhookId', null, new UID(), 'Webhook unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $webhookId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if (!$project->findAndRemove('$id', $webhookId, 'webhooks')) {
2020-07-01 03:46:42 +12:00
throw new Exception('Webhook not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2020-07-01 03:46:42 +12:00
$response->noContent();
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
// Keys
2020-06-29 05:31:21 +12:00
App::post('/v1/projects/:projectId/keys')
2020-02-01 11:34:07 +13:00
->desc('Create Key')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
2020-02-01 11:34:07 +13:00
->label('sdk.method', 'createKey')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_KEY)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('name', null, new Text(128), 'Key name. Max length: 128 chars.')
2021-01-01 19:42:50 +13:00
->param('scopes', null, new ArrayList(new WhiteList(array_keys(Config::getParam('scopes')), true)), 'Key scopes list.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $name, $scopes, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$key = new Document([
'$id' => $dbForConsole->getId(),
2020-07-01 03:46:42 +12:00
'name' => $name,
'scopes' => $scopes,
'secret' => \bin2hex(\random_bytes(128)),
]);
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('keys', $key, Document::SET_TYPE_APPEND)
2021-05-16 10:41:42 +12:00
);
2020-07-01 03:46:42 +12:00
2021-05-27 22:09:14 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($key, Response::MODEL_KEY);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/keys')
2020-02-01 11:34:07 +13:00
->desc('List Keys')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listKeys')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_KEY_LIST)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2021-06-07 17:17:29 +12:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-07-01 03:46:42 +12:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
2020-02-01 11:34:07 +13:00
}
2020-07-01 03:46:42 +12:00
2020-08-15 09:56:50 +12:00
$keys = $project->getAttribute('keys', []);
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'keys' => $keys,
2020-08-15 09:56:50 +12:00
'sum' => count($keys),
]), Response::MODEL_KEY_LIST);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/keys/:keyId')
2020-02-01 11:34:07 +13:00
->desc('Get Key')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getKey')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_KEY)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('keyId', null, new UID(), 'Key unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $keyId, $response, $dbForConsole) {
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$key = $project->find('$id', $keyId, 'keys');
2020-02-01 11:34:07 +13:00
2020-07-01 03:46:42 +12:00
if (empty($key) || !$key instanceof Document) {
throw new Exception('Key not found', 404);
2020-02-01 11:34:07 +13:00
}
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($key, Response::MODEL_KEY);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::put('/v1/projects/:projectId/keys/:keyId')
2019-12-18 23:24:54 +13:00
->desc('Update Key')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateKey')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_KEY)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('keyId', null, new UID(), 'Key unique ID.')
->param('name', null, new Text(128), 'Key name. Max length: 128 chars.')
2021-01-01 19:42:50 +13:00
->param('scopes', null, new ArrayList(new WhiteList(array_keys(Config::getParam('scopes')), true)), 'Key scopes list')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $keyId, $name, $scopes, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$key = $project->find('$id', $keyId, 'keys');
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
if (empty($key) || !$key instanceof Document) {
throw new Exception('Key not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project->findAndReplace('$id', $key->getId(), $key
2021-06-07 17:17:29 +12:00
->setAttribute('name', $name)
->setAttribute('scopes', $scopes)
, 'keys');
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2021-06-07 17:17:29 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($key, Response::MODEL_KEY);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::delete('/v1/projects/:projectId/keys/:keyId')
2019-12-18 23:24:54 +13:00
->desc('Delete Key')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteKey')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('keyId', null, new UID(), 'Key unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $keyId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if (!$project->findAndRemove('$id', $keyId, 'keys')) {
2020-07-01 03:46:42 +12:00
throw new Exception('Key not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2020-07-01 03:46:42 +12:00
$response->noContent();
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
// Tasks
2020-06-29 05:31:21 +12:00
App::post('/v1/projects/:projectId/tasks')
2019-12-18 23:24:54 +13:00
->desc('Create Task')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createTask')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_TASK)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('name', null, new Text(128), 'Task name. Max length: 128 chars.')
->param('status', null, new WhiteList(['play', 'pause'], true), 'Task status.')
->param('schedule', null, new Cron(), 'Task schedule CRON syntax.')
->param('security', false, new Boolean(true), 'Certificate verification, false for disabled or true for enabled.')
->param('httpMethod', '', new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT'], true), 'Task HTTP method.')
->param('httpUrl', '', new URL(), 'Task HTTP URL')
->param('httpHeaders', null, new ArrayList(new Text(256)), 'Task HTTP headers list.', true)
->param('httpUser', '', new Text(256), 'Task HTTP user. Max length: 256 chars.', true)
->param('httpPass', '', new Text(256), 'Task HTTP password. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-02-22 10:37:22 +13:00
$cron = new CronExpression($schedule);
2020-07-01 03:46:42 +12:00
$next = ($status == 'play') ? $cron->getNextRunDate()->format('U') : null;
$security = ($security === '1' || $security === 'true' || $security === 1 || $security === true);
2021-05-16 10:41:42 +12:00
$task = new Document([
'$id' => $dbForConsole->getId(),
2021-07-17 02:32:20 +12:00
'projectId' => $project->getId(),
2020-07-01 03:46:42 +12:00
'name' => $name,
'status' => $status,
'schedule' => $schedule,
'updated' => \time(),
'previous' => null,
'next' => $next,
2020-07-09 21:11:42 +12:00
'security' => $security,
2020-07-01 03:46:42 +12:00
'httpMethod' => $httpMethod,
'httpUrl' => $httpUrl,
'httpHeaders' => $httpHeaders,
'httpUser' => $httpUser,
'httpPass' => $httpPass,
'log' => '{}',
'failures' => 0,
]);
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('tasks', $task, Document::SET_TYPE_APPEND)
2021-05-16 10:41:42 +12:00
);
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
if ($next) {
ResqueScheduler::enqueueAt($next, 'v1-tasks', 'TasksV1', $task->getArrayCopy());
2019-12-18 23:24:54 +13:00
}
2020-07-01 03:46:42 +12:00
2021-05-27 22:09:14 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($task, Response::MODEL_TASK);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/tasks')
2020-02-01 11:34:07 +13:00
->desc('List Tasks')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listTasks')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_TASK_LIST)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-01 11:34:07 +13:00
2020-07-01 03:46:42 +12:00
$tasks = $project->getAttribute('tasks', []);
2020-02-01 11:34:07 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'tasks' => $tasks,
2020-08-15 09:56:50 +12:00
'sum' => count($tasks),
]), Response::MODEL_TASK_LIST);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/tasks/:taskId')
2020-02-01 11:34:07 +13:00
->desc('Get Task')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getTask')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_TASK)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('taskId', null, new UID(), 'Task unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $taskId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$task = $project->find('$id', $taskId, 'tasks');
2020-02-01 11:34:07 +13:00
2020-07-01 03:46:42 +12:00
if (empty($task) || !$task instanceof Document) {
throw new Exception('Task not found', 404);
}
2020-02-01 11:34:07 +13:00
2021-07-26 02:47:18 +12:00
$response->dynamic($task, Response::MODEL_TASK);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::put('/v1/projects/:projectId/tasks/:taskId')
2019-12-18 23:24:54 +13:00
->desc('Update Task')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateTask')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_TASK)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('taskId', null, new UID(), 'Task unique ID.')
->param('name', null, new Text(128), 'Task name. Max length: 128 chars.')
->param('status', null, new WhiteList(['play', 'pause'], true), 'Task status.')
->param('schedule', null, new Cron(), 'Task schedule CRON syntax.')
->param('security', false, new Boolean(true), 'Certificate verification, false for disabled or true for enabled.')
->param('httpMethod', '', new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT'], true), 'Task HTTP method.')
->param('httpUrl', '', new URL(), 'Task HTTP URL.')
->param('httpHeaders', null, new ArrayList(new Text(256)), 'Task HTTP headers list.', true)
->param('httpUser', '', new Text(256), 'Task HTTP user. Max length: 256 chars.', true)
->param('httpPass', '', new Text(256), 'Task HTTP password. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $taskId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$task = $project->find('$id', $taskId, 'tasks');
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
if (empty($task) || !$task instanceof Document) {
throw new Exception('Task not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-02-22 10:37:22 +13:00
$cron = new CronExpression($schedule);
2020-07-01 03:46:42 +12:00
$next = ($status == 'play') ? $cron->getNextRunDate()->format('U') : null;
$security = ($security === '1' || $security === 'true' || $security === 1 || $security === true);
2021-05-16 10:41:42 +12:00
$project->findAndReplace('$id', $task->getId(), $task
2021-06-07 17:17:29 +12:00
->setAttribute('name', $name)
->setAttribute('status', $status)
->setAttribute('schedule', $schedule)
->setAttribute('updated', \time())
->setAttribute('next', $next)
->setAttribute('security', $security)
->setAttribute('httpMethod', $httpMethod)
->setAttribute('httpUrl', $httpUrl)
->setAttribute('httpHeaders', $httpHeaders)
->setAttribute('httpUser', $httpUser)
->setAttribute('httpPass', $httpPass)
, 'tasks');
2020-07-01 03:46:42 +12:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
if ($next) {
ResqueScheduler::enqueueAt($next, 'v1-tasks', 'TasksV1', $task->getArrayCopy());
2019-12-18 23:24:54 +13:00
}
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($task, Response::MODEL_TASK);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::delete('/v1/projects/:projectId/tasks/:taskId')
2019-12-18 23:24:54 +13:00
->desc('Delete Task')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteTask')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('taskId', null, new UID(), 'Task unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $taskId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if (!$project->findAndRemove('$id', $taskId, 'tasks')) {
2020-07-01 03:46:42 +12:00
throw new Exception('Task not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2020-07-01 03:46:42 +12:00
$response->noContent();
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
// Platforms
2020-06-29 05:31:21 +12:00
App::post('/v1/projects/:projectId/platforms')
2019-12-18 23:24:54 +13:00
->desc('Create Platform')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createPlatform')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PLATFORM)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
2021-05-06 17:34:34 +12:00
->param('type', null, new WhiteList(['web', 'flutter-ios', 'flutter-android', 'flutter-linux', 'flutter-macos', 'flutter-windows', 'ios', 'android', 'unity'], true), 'Platform type.')
2020-09-11 02:40:14 +12:00
->param('name', null, new Text(128), 'Platform name. Max length: 128 chars.')
->param('key', '', new Text(256), 'Package name for android or bundle ID for iOS. Max length: 256 chars.', true)
->param('store', '', new Text(256), 'App store or Google Play store ID. Max length: 256 chars.', true)
->param('hostname', '', new Text(256), 'Platform client hostname. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $type, $name, $key, $store, $hostname, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$platform = new Document([
'$id' => $dbForConsole->getId(),
2020-07-01 03:46:42 +12:00
'type' => $type,
'name' => $name,
'key' => $key,
'store' => $store,
'hostname' => $hostname,
'dateCreated' => \time(),
'dateUpdated' => \time(),
]);
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('platforms', $platform, Document::SET_TYPE_APPEND)
2021-05-16 10:41:42 +12:00
);
2020-07-01 03:46:42 +12:00
2021-05-27 22:09:14 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($platform, Response::MODEL_PLATFORM);
2020-12-27 05:33:36 +13:00
});
2021-06-07 17:17:29 +12:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/platforms')
2020-02-01 11:34:07 +13:00
->desc('List Platforms')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listPlatforms')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PLATFORM_LIST)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
2020-02-01 11:34:07 +13:00
}
2020-07-01 03:46:42 +12:00
$platforms = $project->getAttribute('platforms', []);
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'platforms' => $platforms,
2020-08-15 09:56:50 +12:00
'sum' => count($platforms),
]), Response::MODEL_PLATFORM_LIST);
2020-12-27 05:33:36 +13:00
});
2020-02-01 11:34:07 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/platforms/:platformId')
2020-02-01 11:34:07 +13:00
->desc('Get Platform')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-01 11:34:07 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-01 11:34:07 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getPlatform')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PLATFORM)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('platformId', null, new UID(), 'Platform unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $platformId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-01 11:34:07 +13:00
2021-05-16 10:41:42 +12:00
$platform = $project->find('$id', $platformId, 'platforms');
2020-02-01 11:34:07 +13:00
2020-07-01 03:46:42 +12:00
if (empty($platform) || !$platform instanceof Document) {
throw new Exception('Platform not found', 404);
2020-02-01 11:34:07 +13:00
}
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($platform, Response::MODEL_PLATFORM);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::put('/v1/projects/:projectId/platforms/:platformId')
2019-12-18 23:24:54 +13:00
->desc('Update Platform')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updatePlatform')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PLATFORM)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('platformId', null, new UID(), 'Platform unique ID.')
->param('name', null, new Text(128), 'Platform name. Max length: 128 chars.')
->param('key', '', new Text(256), 'Package name for android or bundle ID for iOS. Max length: 256 chars.', true)
->param('store', '', new Text(256), 'App store or Google Play store ID. Max length: 256 chars.', true)
->param('hostname', '', new Text(256), 'Platform client URL. Max length: 256 chars.', true)
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $platformId, $name, $key, $store, $hostname, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$platform = $project->find('$id', $platformId, 'platforms');
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
if (empty($platform) || !$platform instanceof Document) {
throw new Exception('Platform not found', 404);
}
2019-12-18 23:24:54 +13:00
2020-07-01 03:46:42 +12:00
$platform
->setAttribute('name', $name)
->setAttribute('dateUpdated', \time())
->setAttribute('key', $key)
->setAttribute('store', $store)
->setAttribute('hostname', $hostname)
;
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project->findAndReplace('$id', $platform->getId(), $platform
2021-06-07 17:17:29 +12:00
->setAttribute('name', $name)
->setAttribute('dateUpdated', \time())
->setAttribute('key', $key)
->setAttribute('store', $store)
->setAttribute('hostname', $hostname)
, 'platforms');
2020-07-01 03:46:42 +12:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2021-07-26 02:47:18 +12:00
$response->dynamic($platform, Response::MODEL_PLATFORM);
2020-12-27 05:33:36 +13:00
});
2019-12-18 23:24:54 +13:00
2020-06-29 05:31:21 +12:00
App::delete('/v1/projects/:projectId/platforms/:platformId')
2019-12-18 23:24:54 +13:00
->desc('Delete Platform')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2019-12-18 23:24:54 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2019-12-18 23:24:54 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deletePlatform')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('platformId', null, new UID(), 'Platform unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $platformId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
if (!$project->findAndRemove('$id', $platformId, 'platforms')) {
2020-07-01 03:46:42 +12:00
throw new Exception('Platform not found', 404);
}
2019-12-18 23:24:54 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2020-07-01 03:46:42 +12:00
$response->noContent();
2020-12-27 05:33:36 +13:00
});
2020-02-22 21:10:30 +13:00
// Domains
2020-06-29 05:31:21 +12:00
App::post('/v1/projects/:projectId/domains')
2020-02-22 21:10:30 +13:00
->desc('Create Domain')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-22 21:10:30 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-22 21:10:30 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createDomain')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_DOMAIN)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('domain', null, new DomainValidator(), 'Domain name.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $domain, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-24 06:05:42 +13:00
2021-05-16 10:41:42 +12:00
$document = $project->find('domain', $domain, 'domains');
2020-02-24 06:05:42 +13:00
2021-05-16 10:41:42 +12:00
if ($document) {
2020-07-01 03:46:42 +12:00
throw new Exception('Domain already exists', 409);
}
2020-07-01 03:46:42 +12:00
$target = new Domain(App::getEnv('_APP_DOMAIN_TARGET', ''));
2020-02-22 21:10:30 +13:00
2020-07-01 03:46:42 +12:00
if (!$target->isKnown() || $target->isTest()) {
2021-06-07 17:17:29 +12:00
throw new Exception('Unreachable CNAME target (' . $target->get() . '), please use a domain with a public suffix.', 500);
2020-07-01 03:46:42 +12:00
}
2020-02-22 21:10:30 +13:00
2020-07-01 03:46:42 +12:00
$domain = new Domain($domain);
2021-05-16 10:41:42 +12:00
$domain = new Document([
'$id' => $dbForConsole->getId(),
2020-07-01 03:46:42 +12:00
'updated' => \time(),
'domain' => $domain->get(),
'tld' => $domain->getSuffix(),
'registerable' => $domain->getRegisterable(),
'verification' => false,
'certificateId' => null,
]);
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project
2021-06-07 17:17:29 +12:00
->setAttribute('domains', $domain, Document::SET_TYPE_APPEND)
2021-05-16 10:41:42 +12:00
);
2020-07-01 03:46:42 +12:00
2021-05-27 22:09:14 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($domain, Response::MODEL_DOMAIN);
2020-12-27 05:33:36 +13:00
});
2020-02-22 21:10:30 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/domains')
2020-02-22 21:10:30 +13:00
->desc('List Domains')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-22 21:10:30 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-22 21:10:30 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listDomains')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_DOMAIN_LIST)
2020-09-11 02:40:14 +12:00
->param('projectId', '', new UID(), 'Project unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
2020-02-22 21:10:30 +13:00
}
2020-07-01 03:46:42 +12:00
$domains = $project->getAttribute('domains', []);
2021-06-07 17:17:29 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'domains' => $domains,
2020-08-15 09:56:50 +12:00
'sum' => count($domains),
]), Response::MODEL_DOMAIN_LIST);
2020-12-27 05:33:36 +13:00
});
2020-02-22 21:10:30 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/projects/:projectId/domains/:domainId')
2020-02-22 21:10:30 +13:00
->desc('Get Domain')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-22 21:10:30 +13:00
->label('scope', 'projects.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-22 21:10:30 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getDomain')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_DOMAIN)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('domainId', null, new UID(), 'Domain unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $domainId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$domain = $project->find('$id', $domainId, 'domains');
2020-02-22 21:10:30 +13:00
2020-07-01 03:46:42 +12:00
if (empty($domain) || !$domain instanceof Document) {
throw new Exception('Domain not found', 404);
2020-02-22 21:10:30 +13:00
}
2020-07-01 03:46:42 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic($domain, Response::MODEL_DOMAIN);
2020-12-27 05:33:36 +13:00
});
2020-02-22 21:10:30 +13:00
2020-06-29 05:31:21 +12:00
App::patch('/v1/projects/:projectId/domains/:domainId/verification')
2020-02-22 21:10:30 +13:00
->desc('Update Domain Verification Status')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-22 21:10:30 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-22 21:10:30 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateDomainVerification')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_DOMAIN)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('domainId', null, new UID(), 'Domain unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
->action(function ($projectId, $domainId, $response, $dbForConsole) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$domain = $project->find('$id', $domainId, 'domains');
2020-07-01 03:46:42 +12:00
if (empty($domain) || !$domain instanceof Document) {
throw new Exception('Domain not found', 404);
}
2020-07-01 03:46:42 +12:00
$target = new Domain(App::getEnv('_APP_DOMAIN_TARGET', ''));
2020-02-23 22:10:32 +13:00
2020-07-01 03:46:42 +12:00
if (!$target->isKnown() || $target->isTest()) {
2021-06-07 17:17:29 +12:00
throw new Exception('Unreachable CNAME target (' . $target->get() . '), please use a domain with a public suffix.', 500);
2020-07-01 03:46:42 +12:00
}
2020-02-22 21:10:30 +13:00
2020-07-01 03:46:42 +12:00
if ($domain->getAttribute('verification') === true) {
2021-07-26 02:47:18 +12:00
return $response->dynamic($domain, Response::MODEL_DOMAIN);
2020-07-01 03:46:42 +12:00
}
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$validator = new CNAME($target->get()); // Verify Domain with DNS records
2020-02-22 21:10:30 +13:00
2020-07-01 03:46:42 +12:00
if (!$validator->isValid($domain->getAttribute('domain', ''))) {
throw new Exception('Failed to verify domain', 401);
}
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$project->findAndReplace('$id', $domain->getId(), $domain
2021-06-07 17:17:29 +12:00
->setAttribute('verification', true)
, 'domains');
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
2020-07-01 03:46:42 +12:00
// Issue a TLS certificate when domain is verified
Resque::enqueue('v1-certificates', 'CertificatesV1', [
'document' => $domain->getArrayCopy(),
'domain' => $domain->getAttribute('domain'),
]);
2021-07-26 02:47:18 +12:00
$response->dynamic($domain, Response::MODEL_DOMAIN);
2020-12-27 05:33:36 +13:00
});
2020-02-22 21:10:30 +13:00
2020-06-29 05:31:21 +12:00
App::delete('/v1/projects/:projectId/domains/:domainId')
2020-02-22 21:10:30 +13:00
->desc('Delete Domain')
2020-06-26 06:32:12 +12:00
->groups(['api', 'projects'])
2020-02-22 21:10:30 +13:00
->label('scope', 'projects.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
2020-02-22 21:10:30 +13:00
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteDomain')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('projectId', null, new UID(), 'Project unique ID.')
->param('domainId', null, new UID(), 'Domain unique ID.')
2020-12-27 05:33:36 +13:00
->inject('response')
2021-05-16 10:41:42 +12:00
->inject('dbForConsole')
2021-02-05 22:05:46 +13:00
->inject('deletes')
2021-05-16 10:41:42 +12:00
->action(function ($projectId, $domainId, $response, $dbForConsole, $deletes) {
2020-08-15 09:56:50 +12:00
/** @var Appwrite\Utopia\Response $response */
2021-05-16 10:41:42 +12:00
/** @var Utopia\Database\Database $dbForConsole */
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$project = $dbForConsole->getDocument('projects', $projectId);
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
if ($project->isEmpty()) {
2020-07-01 03:46:42 +12:00
throw new Exception('Project not found', 404);
}
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$domain = $project->find('$id', $domainId, 'domains');
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
if (!$project->findAndRemove('$id', $domainId, 'domains')) {
2020-07-01 03:46:42 +12:00
throw new Exception('Domain not found', 404);
}
2020-02-22 21:10:30 +13:00
2021-05-16 10:41:42 +12:00
$dbForConsole->updateDocument('projects', $project->getId(), $project);
$deletes
->setParam('type', DELETE_TYPE_CERTIFICATES)
->setParam('document', $domain)
;
2020-07-01 03:46:42 +12:00
$response->noContent();
2021-06-07 17:17:29 +12:00
});