2019-12-15 08:33:29 +13:00
< ? php
2020-03-25 06:56:32 +13:00
use Appwrite\Auth\Auth ;
2020-06-12 07:36:10 +12:00
use Appwrite\Network\Validator\CNAME ;
2020-07-08 10:11:02 +12:00
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 ([
'$collection' => 'projects' ,
2021-06-07 17:17:29 +12:00
'$read' => [ 'team:' . $teamId ],
'$write' => [ 'team:' . $teamId . '/owner' , 'team:' . $teamId . '/developer' ],
2021-05-16 10:41:42 +12:00
'name' => $name ,
'description' => $description ,
'logo' => $logo ,
'url' => $url ,
'legalName' => $legalName ,
'legalCountry' => $legalCountry ,
'legalState' => $legalState ,
'legalCity' => $legalCity ,
'legalAddress' => $legalAddress ,
'legalTaxId' => $legalTaxId ,
'teamId' => $team -> getId (),
'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-06-07 17:52:40 +12:00
$audit = new Audit ( $dbForInternal );
$audit -> setup ();
2021-06-09 18:45:02 +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 ) {
$dbForInternal -> createCollection ( $key );
foreach ( $collection [ 'attributes' ] as $i => $attribute ) {
$dbForInternal -> createAttribute (
$key ,
$attribute [ '$id' ],
$attribute [ 'type' ],
$attribute [ 'size' ],
$attribute [ 'required' ],
$attribute [ 'signed' ],
$attribute [ 'array' ],
$attribute [ 'filters' ],
);
}
foreach ( $collection [ 'indexes' ] as $i => $index ) {
2021-05-06 00:28:01 +12:00
$dbForInternal -> createIndex (
$key ,
$index [ '$id' ],
$index [ 'type' ],
$index [ 'attributes' ],
$index [ 'lengths' ],
$index [ 'orders' ],
);
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 );
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( 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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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.' )
2020-09-12 06:08:41 +12:00
-> 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
2021-01-13 02:35:17 +13: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
2021-01-13 02:35:17 +13:00
$client = $register -> get ( 'influxdb' );
2021-06-07 17:17:29 +12:00
2021-01-13 02:35:17 +13:00
$requests = [];
$network = [];
$functions = [];
2021-06-07 17:17:29 +12:00
2021-01-13 02:35:17 +13: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
2021-01-13 02:35:17 +13: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)' );
2021-01-13 02:35:17 +13:00
$points = $result -> getPoints ();
2021-06-07 17:17:29 +12:00
2021-01-13 02:35:17 +13: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
2021-01-13 02:35:17 +13: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)' );
2021-01-13 02:35:17 +13:00
$points = $result -> getPoints ();
2021-06-07 17:17:29 +12:00
2021-01-13 02:35:17 +13: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
2021-01-13 02:35:17 +13: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)' );
2021-01-13 02:35:17 +13:00
$points = $result -> getPoints ();
2021-06-07 17:17:29 +12:00
2021-01-13 02:35:17 +13: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
}
2021-01-13 02:35:17 +13: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' => [
2020-07-13 08:43:03 +12:00
'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 (
[
2020-07-17 21:48:43 +12:00
'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
) +
2020-07-17 21:48:43 +12:00
$projectDB -> getCount (
[
2020-08-08 22:41:17 +12:00
'attribute' => 'size' ,
2020-07-17 21:48:43 +12:00
'filters' => [
2021-05-16 10:41:42 +12:00
'$collection=tags' ,
2020-07-17 21:48:43 +12:00
],
]
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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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 :: 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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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 );
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( 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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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 );
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( 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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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 (),
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 );
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( 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-09-13 02:36:28 +12:00
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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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 );
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( 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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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 );
$response -> dynamic2 ( $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-02-23 21:59:29 +13:00
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 );
$response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( 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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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' )
2020-02-23 21:59:29 +13:00
-> 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-02-23 21:59:29 +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-23 21:59:29 +13:00
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-05-16 10:41:42 +12:00
return $response -> dynamic2 ( $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-05-16 10:41:42 +12:00
$response -> dynamic2 ( $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
});