1
0
Fork 0
mirror of synced 2024-06-28 19:20:25 +12:00

Merge pull request #449 from appwrite/single-controller

Single controller
This commit is contained in:
Eldad A. Fux 2020-06-25 22:48:36 +03:00 committed by GitHub
commit e6c10a6201
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
44 changed files with 370 additions and 272 deletions

View file

@ -171,6 +171,16 @@ Improve PHP exeution time by using [fully-qualified function calls](https://veew
php-cs-fixer fix src/ --rules=native_function_invocation --allow-risky=yes
```
Coding Standards:
```bash
php-cs-fixer fix app/controllers --rules='{"braces": {"allow_single_line_closure": true}}'
```
```bash
php-cs-fixer fix src --rules='{"braces": {"allow_single_line_closure": true}}'
```
## Tutorials
From time to time, our team will add tutorials that will help contributors find their way in the Appwrite source code. Below is a list of currently available tutorials:

View file

@ -3,7 +3,7 @@
// Init
require_once __DIR__.'/init.php';
global $utopia, $request, $response, $register, $consoleDB, $project, $service;
global $utopia, $request, $response, $register, $consoleDB, $project;
use Utopia\App;
use Utopia\Request;
@ -426,14 +426,8 @@ $utopia->get('/.well-known/acme-challenge')
}
);
$name = APP_NAME;
if (\array_key_exists($service, $services)) { /** @noinspection PhpIncludeInspection */
include_once $services[$service]['controller'];
$name = APP_NAME.' '.\ucfirst($services[$service]['name']);
} else {
/** @noinspection PhpIncludeInspection */
include_once $services['/']['controller'];
foreach($services as $key => $service) {
include_once $services[$key]['controller'];
}
$utopia->run($request, $response);

View file

@ -45,11 +45,11 @@ $utopia->init(function() use (&$oauth2Keys) {
$oauth2Keys[] = 'oauth2'.\ucfirst($key);
$oauth2Keys[] = 'oauth2'.\ucfirst($key).'AccessToken';
}
});
}, 'account');
$utopia->post('/v1/account')
->desc('Create Account')
->groups(['api', 'account'])
->label('webhook', 'account.create')
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -150,6 +150,7 @@ $utopia->post('/v1/account')
$utopia->post('/v1/account/sessions')
->desc('Create Account Session')
->groups(['api', 'account'])
->label('webhook', 'account.sessions.create')
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -223,7 +224,7 @@ $utopia->post('/v1/account/sessions')
->setParam('resource', 'users/'.$profile->getId())
;
if(!Config::getParam('domainVerification')) {
if (!Config::getParam('domainVerification')) {
$response
->addHeader('X-Fallback-Cookies', \json_encode([Auth::$cookieName => Auth::encodeSession($profile->getId(), $secret)]))
;
@ -240,6 +241,7 @@ $utopia->post('/v1/account/sessions')
$utopia->get('/v1/account/sessions/oauth2/:provider')
->desc('Create Account Session with OAuth2')
->groups(['api', 'account'])
->label('error', __DIR__.'/../../views/general/error.phtml')
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -290,6 +292,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider')
$utopia->get('/v1/account/sessions/oauth2/callback/:provider/:projectId')
->desc('OAuth2 Callback')
->groups(['api', 'account'])
->label('error', __DIR__.'/../../views/general/error.phtml')
->label('scope', 'public')
->label('docs', false)
@ -312,6 +315,7 @@ $utopia->get('/v1/account/sessions/oauth2/callback/:provider/:projectId')
$utopia->post('/v1/account/sessions/oauth2/callback/:provider/:projectId')
->desc('OAuth2 Callback')
->groups(['api', 'account'])
->label('error', __DIR__.'/../../views/general/error.phtml')
->label('scope', 'public')
->label('origin', '*')
@ -335,6 +339,7 @@ $utopia->post('/v1/account/sessions/oauth2/callback/:provider/:projectId')
$utopia->get('/v1/account/sessions/oauth2/:provider/redirect')
->desc('OAuth2 Redirect')
->groups(['api', 'account'])
->label('error', __DIR__.'/../../views/general/error.phtml')
->label('webhook', 'account.sessions.create')
->label('scope', 'public')
@ -500,13 +505,13 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect')
->setParam('data', ['provider' => $provider])
;
if(!Config::getParam('domainVerification')) {
if (!Config::getParam('domainVerification')) {
$response
->addHeader('X-Fallback-Cookies', \json_encode([Auth::$cookieName => Auth::encodeSession($user->getId(), $secret)]))
;
}
if($state['success'] === $oauthDefaultSuccess) { // Add keys for non-web platforms
if ($state['success'] === $oauthDefaultSuccess) { // Add keys for non-web platforms
$state['success'] = URLParser::parse($state['success']);
$query = URLParser::parseQuery($state['success']['query']);
$query['project'] = $project->getId();
@ -529,6 +534,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect')
$utopia->get('/v1/account')
->desc('Get Account')
->groups(['api', 'account'])
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -552,6 +558,7 @@ $utopia->get('/v1/account')
$utopia->get('/v1/account/prefs')
->desc('Get Account Preferences')
->groups(['api', 'account'])
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -574,6 +581,7 @@ $utopia->get('/v1/account/prefs')
$utopia->get('/v1/account/sessions')
->desc('Get Account Sessions')
->groups(['api', 'account'])
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -632,6 +640,7 @@ $utopia->get('/v1/account/sessions')
$utopia->get('/v1/account/logs')
->desc('Get Account Logs')
->groups(['api', 'account'])
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -704,6 +713,7 @@ $utopia->get('/v1/account/logs')
$utopia->patch('/v1/account/name')
->desc('Update Account Name')
->groups(['api', 'account'])
->label('webhook', 'account.update.name')
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -741,6 +751,7 @@ $utopia->patch('/v1/account/name')
$utopia->patch('/v1/account/password')
->desc('Update Account Password')
->groups(['api', 'account'])
->label('webhook', 'account.update.password')
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -783,6 +794,7 @@ $utopia->patch('/v1/account/password')
$utopia->patch('/v1/account/email')
->desc('Update Account Email')
->groups(['api', 'account'])
->label('webhook', 'account.update.email')
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -841,6 +853,7 @@ $utopia->patch('/v1/account/email')
$utopia->patch('/v1/account/prefs')
->desc('Update Account Preferences')
->groups(['api', 'account'])
->label('webhook', 'account.update.prefs')
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -881,6 +894,7 @@ $utopia->patch('/v1/account/prefs')
$utopia->delete('/v1/account')
->desc('Delete Account')
->groups(['api', 'account'])
->label('webhook', 'account.delete')
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -920,7 +934,7 @@ $utopia->delete('/v1/account')
])
;
if(!Config::getParam('domainVerification')) {
if (!Config::getParam('domainVerification')) {
$response
->addHeader('X-Fallback-Cookies', \json_encode([]))
;
@ -936,6 +950,7 @@ $utopia->delete('/v1/account')
$utopia->delete('/v1/account/sessions/:sessionId')
->desc('Delete Account Session')
->groups(['api', 'account'])
->label('scope', 'account')
->label('webhook', 'account.sessions.delete')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -972,7 +987,7 @@ $utopia->delete('/v1/account/sessions/:sessionId')
])
;
if(!Config::getParam('domainVerification')) {
if (!Config::getParam('domainVerification')) {
$response
->addHeader('X-Fallback-Cookies', \json_encode([]))
;
@ -995,6 +1010,7 @@ $utopia->delete('/v1/account/sessions/:sessionId')
$utopia->delete('/v1/account/sessions')
->desc('Delete All Account Sessions')
->groups(['api', 'account'])
->label('scope', 'account')
->label('webhook', 'account.sessions.delete')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
@ -1025,7 +1041,7 @@ $utopia->delete('/v1/account/sessions')
])
;
if(!Config::getParam('domainVerification')) {
if (!Config::getParam('domainVerification')) {
$response
->addHeader('X-Fallback-Cookies', \json_encode([]))
;
@ -1045,6 +1061,7 @@ $utopia->delete('/v1/account/sessions')
$utopia->post('/v1/account/recovery')
->desc('Create Password Recovery')
->groups(['api', 'account'])
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -1144,6 +1161,7 @@ $utopia->post('/v1/account/recovery')
$utopia->put('/v1/account/recovery')
->desc('Complete Password Recovery')
->groups(['api', 'account'])
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -1214,6 +1232,7 @@ $utopia->put('/v1/account/recovery')
$utopia->post('/v1/account/verification')
->desc('Create Email Verification')
->groups(['api', 'account'])
->label('scope', 'account')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')
@ -1300,6 +1319,7 @@ $utopia->post('/v1/account/verification')
$utopia->put('/v1/account/verification')
->desc('Complete Email Verification')
->groups(['api', 'account'])
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'account')

View file

@ -26,7 +26,7 @@ $types = [
'flags' => include __DIR__.'/../../config/avatars/flags.php',
];
$avatarCallback = function ($type, $code, $width, $height, $quality) use ($types, $response, $request) {
$avatarCallback = function ($type, $code, $width, $height, $quality) use ($types, $response) {
$code = \strtolower($code);
$type = \strtolower($type);
@ -86,12 +86,11 @@ $avatarCallback = function ($type, $code, $width, $height, $quality) use ($types
echo $data;
unset($resize);
exit(0);
};
$utopia->get('/v1/avatars/credit-cards/:code')
->desc('Get Credit Card Icon')
->groups(['api', 'avatars'])
->param('code', '', function () use ($types) { return new WhiteList(\array_keys($types['credit-cards'])); }, 'Credit Card Code. Possible values: '.\implode(', ', \array_keys($types['credit-cards'])).'.')
->param('width', 100, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true)
->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true)
@ -102,11 +101,13 @@ $utopia->get('/v1/avatars/credit-cards/:code')
->label('sdk.method', 'getCreditCard')
->label('sdk.methodType', 'location')
->label('sdk.description', '/docs/references/avatars/get-credit-card.md')
->action(function ($code, $width, $height, $quality) use ($avatarCallback) { return $avatarCallback('credit-cards', $code, $width, $height, $quality);
->action(function ($code, $width, $height, $quality) use ($avatarCallback) {
return $avatarCallback('credit-cards', $code, $width, $height, $quality);
});
$utopia->get('/v1/avatars/browsers/:code')
->desc('Get Browser Icon')
->groups(['api', 'avatars'])
->param('code', '', function () use ($types) { return new WhiteList(\array_keys($types['browsers'])); }, 'Browser Code.')
->param('width', 100, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true)
->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true)
@ -117,11 +118,13 @@ $utopia->get('/v1/avatars/browsers/:code')
->label('sdk.method', 'getBrowser')
->label('sdk.methodType', 'location')
->label('sdk.description', '/docs/references/avatars/get-browser.md')
->action(function ($code, $width, $height, $quality) use ($avatarCallback) { return $avatarCallback('browsers', $code, $width, $height, $quality);
->action(function ($code, $width, $height, $quality) use ($avatarCallback) {
return $avatarCallback('browsers', $code, $width, $height, $quality);
});
$utopia->get('/v1/avatars/flags/:code')
->desc('Get Country Flag')
->groups(['api', 'avatars'])
->param('code', '', function () use ($types) { return new WhiteList(\array_keys($types['flags'])); }, 'Country Code. ISO Alpha-2 country code format.')
->param('width', 100, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true)
->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true)
@ -132,11 +135,13 @@ $utopia->get('/v1/avatars/flags/:code')
->label('sdk.method', 'getFlag')
->label('sdk.methodType', 'location')
->label('sdk.description', '/docs/references/avatars/get-flag.md')
->action(function ($code, $width, $height, $quality) use ($avatarCallback) { return $avatarCallback('flags', $code, $width, $height, $quality);
->action(function ($code, $width, $height, $quality) use ($avatarCallback) {
return $avatarCallback('flags', $code, $width, $height, $quality);
});
$utopia->get('/v1/avatars/image')
->desc('Get Image from URL')
->groups(['api', 'avatars'])
->param('url', '', function () { return new URL(); }, 'Image URL which you want to crop.')
->param('width', 400, function () { return new Range(0, 2000); }, 'Resize preview image width, Pass an integer between 0 to 2000.', true)
->param('height', 400, function () { return new Range(0, 2000); }, 'Resize preview image height, Pass an integer between 0 to 2000.', true)
@ -199,13 +204,12 @@ $utopia->get('/v1/avatars/image')
echo $data;
unset($resize);
exit(0);
}
);
$utopia->get('/v1/avatars/favicon')
->desc('Get Favicon')
->groups(['api', 'avatars'])
->param('url', '', function () { return new URL(); }, 'Website URL which you want to fetch the favicon from.')
->label('scope', 'avatars.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
@ -353,13 +357,12 @@ $utopia->get('/v1/avatars/favicon')
echo $data;
unset($resize);
exit(0);
}
);
$utopia->get('/v1/avatars/qr')
->desc('Get QR Code')
->groups(['api', 'avatars'])
->param('text', '', function () { return new Text(512); }, 'Plain text to be converted to QR code image.')
->param('size', 400, function () { return new Range(0, 1000); }, 'QR code size. Pass an integer between 0 to 1000. Defaults to 400.', true)
->param('margin', 1, function () { return new Range(0, 10); }, 'Margin from edge. Pass an integer between 0 to 10. Defaults to 1.', true)
@ -393,6 +396,7 @@ $utopia->get('/v1/avatars/qr')
$utopia->get('/v1/avatars/initials')
->desc('Get User Initials')
->groups(['api', 'avatars'])
->param('name', '', function () { return new Text(512); }, 'Full Name. When empty, current user name or email will be used.', true)
->param('width', 500, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true)
->param('height', 500, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true)
@ -430,7 +434,7 @@ $utopia->get('/v1/avatars/initials')
$initials .= (isset($w[0])) ? $w[0] : '';
$code += (isset($w[0])) ? \ord($w[0]) : 0;
if($key == 1) {
if ($key == 1) {
break;
}
}

View file

@ -27,10 +27,9 @@ use GeoIp2\Database\Reader;
include_once __DIR__ . '/../shared/api.php';
$isDev = (App::MODE_TYPE_PRODUCTION !== $utopia->getMode());
$utopia->post('/v1/database/collections')
->desc('Create Collection')
->groups(['api', 'database'])
->label('webhook', 'database.collections.create')
->label('scope', 'collections.write')
->label('sdk.namespace', 'database')
@ -104,6 +103,7 @@ $utopia->post('/v1/database/collections')
$utopia->get('/v1/database/collections')
->desc('List Collections')
->groups(['api', 'database'])
->label('scope', 'collections.read')
->label('sdk.namespace', 'database')
->label('sdk.platform', [APP_PLATFORM_SERVER])
@ -152,6 +152,7 @@ $utopia->get('/v1/database/collections')
$utopia->get('/v1/database/collections/:collectionId')
->desc('Get Collection')
->groups(['api', 'database'])
->label('scope', 'collections.read')
->label('sdk.namespace', 'database')
->label('sdk.platform', [APP_PLATFORM_SERVER])
@ -172,6 +173,7 @@ $utopia->get('/v1/database/collections/:collectionId')
// $utopia->get('/v1/database/collections/:collectionId/logs')
// ->desc('Get Collection Logs')
// ->groups(['api', 'database'])
// ->label('scope', 'collections.read')
// ->label('sdk.platform', [APP_PLATFORM_SERVER])
// ->label('sdk.namespace', 'database')
@ -180,7 +182,7 @@ $utopia->get('/v1/database/collections/:collectionId')
// ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.')
// ->action(
// function ($collectionId) use ($response, $register, $projectDB, $project) {
// $collection = $projectDB->getDocument($collectionId);
// $collection = $projectDB->getDocument($collectionId, false);
// if (empty($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) {
// throw new Exception('Collection not found', 404);
@ -236,6 +238,7 @@ $utopia->get('/v1/database/collections/:collectionId')
$utopia->put('/v1/database/collections/:collectionId')
->desc('Update Collection')
->groups(['api', 'database'])
->label('scope', 'collections.write')
->label('webhook', 'database.collections.update')
->label('sdk.namespace', 'database')
@ -308,6 +311,7 @@ $utopia->put('/v1/database/collections/:collectionId')
$utopia->delete('/v1/database/collections/:collectionId')
->desc('Delete Collection')
->groups(['api', 'database'])
->label('scope', 'collections.write')
->label('webhook', 'database.collections.delete')
->label('sdk.namespace', 'database')
@ -345,6 +349,7 @@ $utopia->delete('/v1/database/collections/:collectionId')
$utopia->post('/v1/database/collections/:collectionId/documents')
->desc('Create Document')
->groups(['api', 'database'])
->label('webhook', 'database.documents.create')
->label('scope', 'documents.write')
->label('sdk.namespace', 'database')
@ -370,7 +375,7 @@ $utopia->post('/v1/database/collections/:collectionId/documents')
throw new Exception('$id is not allowed for creating new documents, try update instead', 400);
}
$collection = $projectDB->getDocument($collectionId/*, $isDev*/);
$collection = $projectDB->getDocument($collectionId, false);
if (\is_null($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) {
throw new Exception('Collection not found', 404);
@ -385,7 +390,7 @@ $utopia->post('/v1/database/collections/:collectionId/documents')
// Read parent document + validate not 404 + validate read / write permission like patch method
// Add payload to parent document property
if ((!empty($parentDocument)) && (!empty($parentProperty))) {
$parentDocument = $projectDB->getDocument($parentDocument);
$parentDocument = $projectDB->getDocument($parentDocument, false);
if (empty($parentDocument->getArrayCopy())) { // Check empty
throw new Exception('No parent document found', 404);
@ -425,7 +430,7 @@ $utopia->post('/v1/database/collections/:collectionId/documents')
$key = (isset($rule['key'])) ? $rule['key'] : '';
$default = (isset($rule['default'])) ? $rule['default'] : null;
if(!isset($data[$key])) {
if (!isset($data[$key])) {
$data[$key] = $default;
}
}
@ -464,6 +469,7 @@ $utopia->post('/v1/database/collections/:collectionId/documents')
$utopia->get('/v1/database/collections/:collectionId/documents')
->desc('List Documents')
->groups(['api', 'database'])
->label('scope', 'documents.read')
->label('sdk.namespace', 'database')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
@ -480,8 +486,8 @@ $utopia->get('/v1/database/collections/:collectionId/documents')
->param('first', 0, function () { return new Range(0, 1); }, 'Return only the first document. Pass 1 for true or 0 for false. The default value is 0.', true)
->param('last', 0, function () { return new Range(0, 1); }, 'Return only the last document. Pass 1 for true or 0 for false. The default value is 0.', true)
->action(
function ($collectionId, $filters, $offset, $limit, $orderField, $orderType, $orderCast, $search, $first, $last) use ($response, $projectDB, $isDev) {
$collection = $projectDB->getDocument($collectionId, $isDev);
function ($collectionId, $filters, $offset, $limit, $orderField, $orderType, $orderCast, $search, $first, $last) use ($response, $projectDB, $utopia) {
$collection = $projectDB->getDocument($collectionId, false);
if (\is_null($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) {
throw new Exception('Collection not found', 404);
@ -504,7 +510,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents')
if ($first || $last) {
$response->json((!empty($list) ? $list->getArrayCopy() : []));
} else {
if ($isDev) {
if ($utopia->isDevelopment()) {
$collection
->setAttribute('debug', $projectDB->getDebug())
->setAttribute('limit', $limit)
@ -531,6 +537,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents')
$utopia->get('/v1/database/collections/:collectionId/documents/:documentId')
->desc('Get Document')
->groups(['api', 'database'])
->label('scope', 'documents.read')
->label('sdk.namespace', 'database')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
@ -539,9 +546,9 @@ $utopia->get('/v1/database/collections/:collectionId/documents/:documentId')
->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID. You can create a new collection with validation rules using the Database service [server integration](/docs/server/database#createCollection).')
->param('documentId', null, function () { return new UID(); }, 'Document unique ID.')
->action(
function ($collectionId, $documentId) use ($response, $request, $projectDB, $isDev) {
$document = $projectDB->getDocument($documentId, $isDev);
$collection = $projectDB->getDocument($collectionId, $isDev);
function ($collectionId, $documentId) use ($response, $request, $projectDB) {
$document = $projectDB->getDocument($documentId, false);
$collection = $projectDB->getDocument($collectionId, false);
if (empty($document->getArrayCopy()) || $document->getCollection() != $collection->getId()) { // Check empty
throw new Exception('No document found', 404);
@ -576,6 +583,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents/:documentId')
$utopia->patch('/v1/database/collections/:collectionId/documents/:documentId')
->desc('Update Document')
->groups(['api', 'database'])
->label('webhook', 'database.documents.update')
->label('scope', 'documents.write')
->label('sdk.namespace', 'database')
@ -588,9 +596,9 @@ $utopia->patch('/v1/database/collections/:collectionId/documents/:documentId')
->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. By default no user is granted with any read permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.')
->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. By default no user is granted with any write permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.')
->action(
function ($collectionId, $documentId, $data, $read, $write) use ($response, $projectDB, &$output, $webhook, $audit, $isDev) {
$collection = $projectDB->getDocument($collectionId/*, $isDev*/);
$document = $projectDB->getDocument($documentId, $isDev);
function ($collectionId, $documentId, $data, $read, $write) use ($response, $projectDB, $webhook, $audit) {
$collection = $projectDB->getDocument($collectionId, false);
$document = $projectDB->getDocument($documentId, false);
$data = (\is_string($data)) ? \json_decode($data, true) : $data; // Cast to JSON array
@ -655,6 +663,7 @@ $utopia->patch('/v1/database/collections/:collectionId/documents/:documentId')
$utopia->delete('/v1/database/collections/:collectionId/documents/:documentId')
->desc('Delete Document')
->groups(['api', 'database'])
->label('scope', 'documents.write')
->label('webhook', 'database.documents.delete')
->label('sdk.namespace', 'database')
@ -664,9 +673,9 @@ $utopia->delete('/v1/database/collections/:collectionId/documents/:documentId')
->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID. You can create a new collection with validation rules using the Database service [server integration](/docs/server/database#createCollection).')
->param('documentId', null, function () { return new UID(); }, 'Document unique ID.')
->action(
function ($collectionId, $documentId) use ($response, $projectDB, $audit, $webhook, $isDev) {
$collection = $projectDB->getDocument($collectionId, $isDev);
$document = $projectDB->getDocument($documentId, $isDev);
function ($collectionId, $documentId) use ($response, $projectDB, $audit, $webhook) {
$collection = $projectDB->getDocument($collectionId, false);
$document = $projectDB->getDocument($documentId, false);
if (empty($document->getArrayCopy()) || $document->getCollection() != $collectionId) { // Check empty
throw new Exception('No document found', 404);

View file

@ -14,6 +14,7 @@ global $utopia;
$utopia->post('/v1/graphql')
->desc('GraphQL Endpoint')
->groups(['api', 'graphql'])
->label('scope', 'public')
->action(
function () {

View file

@ -9,6 +9,7 @@ use Appwrite\ClamAV\Network;
$utopia->get('/v1/health')
->desc('Get HTTP')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -22,6 +23,7 @@ $utopia->get('/v1/health')
$utopia->get('/v1/health/version')
->desc('Get Version')
->groups(['api', 'health'])
->label('scope', 'public')
->action(
function () use ($response) {
@ -31,6 +33,7 @@ $utopia->get('/v1/health/version')
$utopia->get('/v1/health/db')
->desc('Get DB')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -46,6 +49,7 @@ $utopia->get('/v1/health/db')
$utopia->get('/v1/health/cache')
->desc('Get Cache')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -61,6 +65,7 @@ $utopia->get('/v1/health/cache')
$utopia->get('/v1/health/time')
->desc('Get Time')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -108,6 +113,7 @@ $utopia->get('/v1/health/time')
$utopia->get('/v1/health/queue/webhooks')
->desc('Get Webhooks Queue')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -121,6 +127,7 @@ $utopia->get('/v1/health/queue/webhooks')
$utopia->get('/v1/health/queue/tasks')
->desc('Get Tasks Queue')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -134,6 +141,7 @@ $utopia->get('/v1/health/queue/tasks')
$utopia->get('/v1/health/queue/logs')
->desc('Get Logs Queue')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -147,6 +155,7 @@ $utopia->get('/v1/health/queue/logs')
$utopia->get('/v1/health/queue/usage')
->desc('Get Usage Queue')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -160,6 +169,7 @@ $utopia->get('/v1/health/queue/usage')
$utopia->get('/v1/health/queue/certificates')
->desc('Get Certificate Queue')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -173,6 +183,7 @@ $utopia->get('/v1/health/queue/certificates')
$utopia->get('/v1/health/queue/functions')
->desc('Get Functions Queue')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -186,6 +197,7 @@ $utopia->get('/v1/health/queue/functions')
$utopia->get('/v1/health/storage/local')
->desc('Get Local Storage')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -193,7 +205,6 @@ $utopia->get('/v1/health/storage/local')
->label('sdk.description', '/docs/references/health/get-storage-local.md')
->action(
function () use ($response) {
foreach ([
'Uploads' => APP_STORAGE_UPLOADS,
'Cache' => APP_STORAGE_CACHE,
@ -217,6 +228,7 @@ $utopia->get('/v1/health/storage/local')
$utopia->get('/v1/health/anti-virus')
->desc('Get Anti virus')
->groups(['api', 'health'])
->label('scope', 'health.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'health')
@ -224,7 +236,7 @@ $utopia->get('/v1/health/anti-virus')
->label('sdk.description', '/docs/references/health/get-storage-anti-virus.md')
->action(
function () use ($request, $response) {
if($request->getServer('_APP_STORAGE_ANTIVIRUS') === 'disabled') { // Check if scans are enabled
if ($request->getServer('_APP_STORAGE_ANTIVIRUS') === 'disabled') { // Check if scans are enabled
throw new Exception('Anitvirus is disabled');
}
@ -239,6 +251,7 @@ $utopia->get('/v1/health/anti-virus')
$utopia->get('/v1/health/stats') // Currently only used internally
->desc('Get System Stats')
->groups(['api', 'health'])
->label('scope', 'god')
// ->label('sdk.platform', [APP_PLATFORM_SERVER])
// ->label('sdk.namespace', 'health')

View file

@ -10,6 +10,7 @@ include_once __DIR__ . '/../shared/api.php';
$utopia->get('/v1/locale')
->desc('Get User Locale')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')
@ -68,6 +69,7 @@ $utopia->get('/v1/locale')
$utopia->get('/v1/locale/countries')
->desc('List Countries')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')
@ -85,6 +87,7 @@ $utopia->get('/v1/locale/countries')
$utopia->get('/v1/locale/countries/eu')
->desc('List EU Countries')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')
@ -110,6 +113,7 @@ $utopia->get('/v1/locale/countries/eu')
$utopia->get('/v1/locale/countries/phones')
->desc('List Countries Phone Codes')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')
@ -135,6 +139,7 @@ $utopia->get('/v1/locale/countries/phones')
$utopia->get('/v1/locale/continents')
->desc('List Continents')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')
@ -153,6 +158,7 @@ $utopia->get('/v1/locale/continents')
$utopia->get('/v1/locale/currencies')
->desc('List Currencies')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')
@ -169,6 +175,7 @@ $utopia->get('/v1/locale/currencies')
$utopia->get('/v1/locale/languages')
->desc('List Languages')
->groups(['api', 'locale'])
->label('scope', 'locale.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'locale')

View file

@ -27,6 +27,7 @@ $scopes = include __DIR__.'/../../../app/config/scopes.php';
$utopia->post('/v1/projects')
->desc('Create Project')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'create')
@ -89,6 +90,7 @@ $utopia->post('/v1/projects')
$utopia->get('/v1/projects')
->desc('List Projects')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'list')
@ -122,6 +124,7 @@ $utopia->get('/v1/projects')
$utopia->get('/v1/projects/:projectId')
->desc('Get Project')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'get')
@ -149,6 +152,7 @@ $utopia->get('/v1/projects/:projectId')
$utopia->get('/v1/projects/:projectId/usage')
->desc('Get Project')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getUsage')
@ -310,6 +314,7 @@ $utopia->get('/v1/projects/:projectId/usage')
$utopia->patch('/v1/projects/:projectId')
->desc('Update Project')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'update')
@ -355,6 +360,7 @@ $utopia->patch('/v1/projects/:projectId')
$utopia->patch('/v1/projects/:projectId/oauth2')
->desc('Update Project OAuth2')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateOAuth2')
@ -396,6 +402,7 @@ $utopia->patch('/v1/projects/:projectId/oauth2')
$utopia->delete('/v1/projects/:projectId')
->desc('Delete Project')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'delete')
@ -415,7 +422,7 @@ $utopia->delete('/v1/projects/:projectId')
$deletes->setParam('document', $project->getArrayCopy());
foreach(['keys', 'webhooks', 'tasks', 'platforms', 'domains'] as $key) { // Delete all children (keys, webhooks, tasks [stop tasks?], platforms)
foreach (['keys', 'webhooks', 'tasks', 'platforms', 'domains'] as $key) { // Delete all children (keys, webhooks, tasks [stop tasks?], platforms)
$list = $project->getAttribute('webhooks', []);
foreach ($list as $document) { /* @var $document Document */
@ -441,6 +448,7 @@ $utopia->delete('/v1/projects/:projectId')
$utopia->post('/v1/projects/:projectId/webhooks')
->desc('Create Webhook')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createWebhook')
@ -505,6 +513,7 @@ $utopia->post('/v1/projects/:projectId/webhooks')
$utopia->get('/v1/projects/:projectId/webhooks')
->desc('List Webhooks')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listWebhooks')
@ -537,6 +546,7 @@ $utopia->get('/v1/projects/:projectId/webhooks')
$utopia->get('/v1/projects/:projectId/webhooks/:webhookId')
->desc('Get Webhook')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getWebhook')
@ -570,6 +580,7 @@ $utopia->get('/v1/projects/:projectId/webhooks/:webhookId')
$utopia->put('/v1/projects/:projectId/webhooks/:webhookId')
->desc('Update Webhook')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateWebhook')
@ -625,6 +636,7 @@ $utopia->put('/v1/projects/:projectId/webhooks/:webhookId')
$utopia->delete('/v1/projects/:projectId/webhooks/:webhookId')
->desc('Delete Webhook')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteWebhook')
@ -656,6 +668,7 @@ $utopia->delete('/v1/projects/:projectId/webhooks/:webhookId')
$utopia->post('/v1/projects/:projectId/keys')
->desc('Create Key')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createKey')
@ -702,6 +715,7 @@ $utopia->post('/v1/projects/:projectId/keys')
$utopia->get('/v1/projects/:projectId/keys')
->desc('List Keys')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listKeys')
@ -720,6 +734,7 @@ $utopia->get('/v1/projects/:projectId/keys')
$utopia->get('/v1/projects/:projectId/keys/:keyId')
->desc('Get Key')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getKey')
@ -745,6 +760,7 @@ $utopia->get('/v1/projects/:projectId/keys/:keyId')
$utopia->put('/v1/projects/:projectId/keys/:keyId')
->desc('Update Key')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateKey')
@ -781,6 +797,7 @@ $utopia->put('/v1/projects/:projectId/keys/:keyId')
$utopia->delete('/v1/projects/:projectId/keys/:keyId')
->desc('Delete Key')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteKey')
@ -812,6 +829,7 @@ $utopia->delete('/v1/projects/:projectId/keys/:keyId')
$utopia->post('/v1/projects/:projectId/tasks')
->desc('Create Task')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createTask')
@ -894,6 +912,7 @@ $utopia->post('/v1/projects/:projectId/tasks')
$utopia->get('/v1/projects/:projectId/tasks')
->desc('List Tasks')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listTasks')
@ -926,6 +945,7 @@ $utopia->get('/v1/projects/:projectId/tasks')
$utopia->get('/v1/projects/:projectId/tasks/:taskId')
->desc('Get Task')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getTask')
@ -958,6 +978,7 @@ $utopia->get('/v1/projects/:projectId/tasks/:taskId')
$utopia->put('/v1/projects/:projectId/tasks/:taskId')
->desc('Update Task')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateTask')
@ -1028,6 +1049,7 @@ $utopia->put('/v1/projects/:projectId/tasks/:taskId')
$utopia->delete('/v1/projects/:projectId/tasks/:taskId')
->desc('Delete Task')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteTask')
@ -1059,6 +1081,7 @@ $utopia->delete('/v1/projects/:projectId/tasks/:taskId')
$utopia->post('/v1/projects/:projectId/platforms')
->desc('Create Platform')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createPlatform')
@ -1112,6 +1135,7 @@ $utopia->post('/v1/projects/:projectId/platforms')
$utopia->get('/v1/projects/:projectId/platforms')
->desc('List Platforms')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listPlatforms')
@ -1132,6 +1156,7 @@ $utopia->get('/v1/projects/:projectId/platforms')
$utopia->get('/v1/projects/:projectId/platforms/:platformId')
->desc('Get Platform')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getPlatform')
@ -1157,6 +1182,7 @@ $utopia->get('/v1/projects/:projectId/platforms/:platformId')
$utopia->put('/v1/projects/:projectId/platforms/:platformId')
->desc('Update Platform')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updatePlatform')
@ -1198,6 +1224,7 @@ $utopia->put('/v1/projects/:projectId/platforms/:platformId')
$utopia->delete('/v1/projects/:projectId/platforms/:platformId')
->desc('Delete Platform')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deletePlatform')
@ -1229,6 +1256,7 @@ $utopia->delete('/v1/projects/:projectId/platforms/:platformId')
$utopia->post('/v1/projects/:projectId/domains')
->desc('Create Domain')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'createDomain')
@ -1250,7 +1278,7 @@ $utopia->post('/v1/projects/:projectId/domains')
$target = new Domain($request->getServer('_APP_DOMAIN_TARGET', ''));
if(!$target->isKnown() || $target->isTest()) {
if (!$target->isKnown() || $target->isTest()) {
throw new Exception('Unreachable CNAME target ('.$target->get().'), plesse use a domain with a public suffix.', 500);
}
@ -1291,6 +1319,7 @@ $utopia->post('/v1/projects/:projectId/domains')
$utopia->get('/v1/projects/:projectId/domains')
->desc('List Domains')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'listDomains')
@ -1311,6 +1340,7 @@ $utopia->get('/v1/projects/:projectId/domains')
$utopia->get('/v1/projects/:projectId/domains/:domainId')
->desc('Get Domain')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'getDomain')
@ -1336,6 +1366,7 @@ $utopia->get('/v1/projects/:projectId/domains/:domainId')
$utopia->patch('/v1/projects/:projectId/domains/:domainId/verification')
->desc('Update Domain Verification Status')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'updateDomainVerification')
@ -1357,18 +1388,18 @@ $utopia->patch('/v1/projects/:projectId/domains/:domainId/verification')
$target = new Domain($request->getServer('_APP_DOMAIN_TARGET', ''));
if(!$target->isKnown() || $target->isTest()) {
if (!$target->isKnown() || $target->isTest()) {
throw new Exception('Unreachable CNAME target ('.$target->get().'), plesse use a domain with a public suffix.', 500);
}
if($domain->getAttribute('verification') === true) {
if ($domain->getAttribute('verification') === true) {
return $response->json($domain->getArrayCopy());
}
// Verify Domain with DNS records
$validator = new CNAME($target->get());
if(!$validator->isValid($domain->getAttribute('domain', ''))) {
if (!$validator->isValid($domain->getAttribute('domain', ''))) {
throw new Exception('Failed to verify domain', 401);
}
@ -1392,6 +1423,7 @@ $utopia->patch('/v1/projects/:projectId/domains/:domainId/verification')
$utopia->delete('/v1/projects/:projectId/domains/:domainId')
->desc('Delete Domain')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk.namespace', 'projects')
->label('sdk.method', 'deleteDomain')

View file

@ -135,6 +135,7 @@ $mimes = [
$utopia->post('/v1/storage/files')
->desc('Create File')
->groups(['api', 'storage'])
->label('scope', 'files.write')
->label('webhook', 'storage.files.create')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
@ -198,7 +199,7 @@ $utopia->post('/v1/storage/files')
$mimeType = $device->getFileMimeType($path); // Get mime-type before compression and encryption
if($request->getServer('_APP_STORAGE_ANTIVIRUS') === 'enabled') { // Check if scans are enabled
if ($request->getServer('_APP_STORAGE_ANTIVIRUS') === 'enabled') { // Check if scans are enabled
$antiVirus = new Network('clamav', 3310);
// Check if file size is exceeding allowed limit
@ -216,7 +217,7 @@ $utopia->post('/v1/storage/files')
$iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM));
$data = OpenSSL::encrypt($data, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag);
if(!$device->write($path, $data)) {
if (!$device->write($path, $data)) {
throw new Exception('Failed to save file', 500);
}
@ -271,6 +272,7 @@ $utopia->post('/v1/storage/files')
$utopia->get('/v1/storage/files')
->desc('List Files')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'storage')
@ -304,6 +306,7 @@ $utopia->get('/v1/storage/files')
$utopia->get('/v1/storage/files/:fileId')
->desc('Get File')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'storage')
@ -324,6 +327,7 @@ $utopia->get('/v1/storage/files/:fileId')
$utopia->get('/v1/storage/files/:fileId/preview')
->desc('Get File Preview')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'storage')
@ -337,8 +341,6 @@ $utopia->get('/v1/storage/files/:fileId/preview')
->param('quality', 100, function () { return new Range(0, 100); }, 'Preview image quality. Pass an integer between 0 to 100. Defaults to 100.', true)
->param('background', '', function () { return new HexColor(); }, 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true)
->param('output', null, function () use ($outputs) { return new WhiteList(\array_merge(\array_keys($outputs), [null])); }, 'Output format type (jpeg, jpg, png, gif and webp).', true)
//->param('storage', 'local', function () {return new WhiteList(array('local'));}, 'Selected storage device. defaults to local')
//->param('token', '', function () {return new Text(128);}, 'Preview token', true)
->action(
function ($fileId, $width, $height, $quality, $background, $output) use ($request, $response, $projectDB, $project, $inputs, $outputs, $fileLogos) {
$storage = 'local';
@ -370,7 +372,7 @@ $utopia->get('/v1/storage/files/:fileId/preview')
$cipher = $file->getAttribute('fileOpenSSLCipher');
$mime = $file->getAttribute('mimeType');
if(!\in_array($mime, $inputs)) {
if (!\in_array($mime, $inputs)) {
$path = (\array_key_exists($mime, $fileLogos)) ? $fileLogos[$mime] : $fileLogos['default'];
$algorithm = null;
$cipher = null;
@ -448,6 +450,7 @@ $utopia->get('/v1/storage/files/:fileId/preview')
$utopia->get('/v1/storage/files/:fileId/download')
->desc('Get File for Download')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'storage')
@ -501,6 +504,7 @@ $utopia->get('/v1/storage/files/:fileId/download')
$utopia->get('/v1/storage/files/:fileId/view')
->desc('Get File for View')
->groups(['api', 'storage'])
->label('scope', 'files.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'storage')
@ -571,6 +575,7 @@ $utopia->get('/v1/storage/files/:fileId/view')
$utopia->put('/v1/storage/files/:fileId')
->desc('Update File')
->groups(['api', 'storage'])
->label('scope', 'files.write')
->label('webhook', 'storage.files.update')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
@ -616,6 +621,7 @@ $utopia->put('/v1/storage/files/:fileId')
$utopia->delete('/v1/storage/files/:fileId')
->desc('Delete File')
->groups(['api', 'storage'])
->label('scope', 'files.write')
->label('webhook', 'storage.files.delete')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
@ -658,6 +664,7 @@ $utopia->delete('/v1/storage/files/:fileId')
// $utopia->get('/v1/storage/files/:fileId/scan')
// ->desc('Scan Storage')
// ->groups(['api', 'storage'])
// ->label('scope', 'god')
// ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
// ->label('sdk.namespace', 'storage')

View file

@ -24,6 +24,7 @@ include_once __DIR__ . '/../shared/api.php';
$utopia->post('/v1/teams')
->desc('Create Team')
->groups(['api', 'teams'])
->label('scope', 'teams.write')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -87,6 +88,7 @@ $utopia->post('/v1/teams')
$utopia->get('/v1/teams')
->desc('List Teams')
->groups(['api', 'teams'])
->label('scope', 'teams.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -116,6 +118,7 @@ $utopia->get('/v1/teams')
$utopia->get('/v1/teams/:teamId')
->desc('Get Team')
->groups(['api', 'teams'])
->label('scope', 'teams.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -136,6 +139,7 @@ $utopia->get('/v1/teams/:teamId')
$utopia->put('/v1/teams/:teamId')
->desc('Update Team')
->groups(['api', 'teams'])
->label('scope', 'teams.write')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -165,6 +169,7 @@ $utopia->put('/v1/teams/:teamId')
$utopia->delete('/v1/teams/:teamId')
->desc('Delete Team')
->groups(['api', 'teams'])
->label('scope', 'teams.write')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -204,6 +209,7 @@ $utopia->delete('/v1/teams/:teamId')
$utopia->post('/v1/teams/:teamId/memberships')
->desc('Create Team Membership')
->groups(['api', 'teams'])
->label('scope', 'teams.write')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -306,12 +312,11 @@ $utopia->post('/v1/teams/:teamId/memberships')
'secret' => Auth::hash($secret),
]);
if(APP_MODE_ADMIN === $mode) { // Allow admin to create membership
if (APP_MODE_ADMIN === $mode) { // Allow admin to create membership
Authorization::disable();
$membership = $projectDB->createDocument($membership->getArrayCopy());
Authorization::reset();
}
else {
} else {
$membership = $projectDB->createDocument($membership->getArrayCopy());
}
@ -344,7 +349,7 @@ $utopia->post('/v1/teams/:teamId/memberships')
->setParam('{{text-cta}}', '#ffffff')
;
if(APP_MODE_ADMIN !== $mode) { // No need in comfirmation when in admin mode
if (APP_MODE_ADMIN !== $mode) { // No need in comfirmation when in admin mode
$mail
->setParam('event', 'teams.membership.create')
->setParam('recipient', $email)
@ -381,6 +386,7 @@ $utopia->post('/v1/teams/:teamId/memberships')
$utopia->get('/v1/teams/:teamId/memberships')
->desc('Get Team Memberships')
->groups(['api', 'teams'])
->label('scope', 'teams.read')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')
@ -433,12 +439,12 @@ $utopia->get('/v1/teams/:teamId/memberships')
}
$response->json(['sum' => $projectDB->getSum(), 'memberships' => $users]);
}
);
$utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status')
->desc('Update Team Membership Status')
->groups(['api', 'teams'])
->label('scope', 'public')
->label('sdk.platform', [APP_PLATFORM_CLIENT])
->label('sdk.namespace', 'teams')
@ -544,7 +550,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status')
->setParam('resource', 'teams/'.$teamId)
;
if(!Config::getParam('domainVerification')) {
if (!Config::getParam('domainVerification')) {
$response
->addHeader('X-Fallback-Cookies', \json_encode([Auth::$cookieName => Auth::encodeSession($user->getId(), $secret)]))
;
@ -571,6 +577,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status')
$utopia->delete('/v1/teams/:teamId/memberships/:inviteId')
->desc('Delete Team Membership')
->groups(['api', 'teams'])
->label('scope', 'teams.write')
->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER])
->label('sdk.namespace', 'teams')

View file

@ -25,6 +25,7 @@ include_once __DIR__ . '/../shared/api.php';
$utopia->post('/v1/users')
->desc('Create User')
->groups(['api', 'users'])
->label('scope', 'users.write')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -94,6 +95,7 @@ $utopia->post('/v1/users')
$utopia->get('/v1/users')
->desc('List Users')
->groups(['api', 'users'])
->label('scope', 'users.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -148,6 +150,7 @@ $utopia->get('/v1/users')
$utopia->get('/v1/users/:userId')
->desc('Get User')
->groups(['api', 'users'])
->label('scope', 'users.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -189,6 +192,7 @@ $utopia->get('/v1/users/:userId')
$utopia->get('/v1/users/:userId/prefs')
->desc('Get User Preferences')
->groups(['api', 'users'])
->label('scope', 'users.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -218,6 +222,7 @@ $utopia->get('/v1/users/:userId/prefs')
$utopia->get('/v1/users/:userId/sessions')
->desc('Get User Sessions')
->groups(['api', 'users'])
->label('scope', 'users.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -281,6 +286,7 @@ $utopia->get('/v1/users/:userId/sessions')
$utopia->get('/v1/users/:userId/logs')
->desc('Get User Logs')
->groups(['api', 'users'])
->label('scope', 'users.read')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -361,6 +367,7 @@ $utopia->get('/v1/users/:userId/logs')
$utopia->patch('/v1/users/:userId/status')
->desc('Update User Status')
->groups(['api', 'users'])
->label('scope', 'users.write')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -409,6 +416,7 @@ $utopia->patch('/v1/users/:userId/status')
$utopia->patch('/v1/users/:userId/prefs')
->desc('Update User Preferences')
->groups(['api', 'users'])
->label('scope', 'users.write')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -451,6 +459,7 @@ $utopia->patch('/v1/users/:userId/prefs')
$utopia->delete('/v1/users/:userId/sessions/:sessionId')
->desc('Delete User Session')
->groups(['api', 'users'])
->label('scope', 'users.write')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')
@ -483,6 +492,7 @@ $utopia->delete('/v1/users/:userId/sessions/:sessionId')
$utopia->delete('/v1/users/:userId/sessions')
->desc('Delete User Sessions')
->groups(['api', 'users'])
->label('scope', 'users.write')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')

View file

@ -22,7 +22,6 @@ $utopia->get('/v1/mock/tests/foo')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -37,7 +36,6 @@ $utopia->post('/v1/mock/tests/foo')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -52,7 +50,6 @@ $utopia->patch('/v1/mock/tests/foo')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -67,7 +64,6 @@ $utopia->put('/v1/mock/tests/foo')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -82,7 +78,6 @@ $utopia->delete('/v1/mock/tests/foo')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -97,7 +92,6 @@ $utopia->get('/v1/mock/tests/bar')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -112,7 +106,6 @@ $utopia->post('/v1/mock/tests/bar')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -127,7 +120,6 @@ $utopia->patch('/v1/mock/tests/bar')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -142,7 +134,6 @@ $utopia->put('/v1/mock/tests/bar')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -157,7 +148,6 @@ $utopia->delete('/v1/mock/tests/bar')
->param('z', null, function () { return new ArrayList(new Text(256)); }, 'Sample array param')
->action(
function ($x, $y, $z) {
}
);
@ -180,19 +170,19 @@ $utopia->post('/v1/mock/tests/general/upload')
$file['size'] = (\is_array($file['size'])) ? $file['size'] : [$file['size']];
foreach ($file['name'] as $i => $name) {
if($name !== 'file.png') {
if ($name !== 'file.png') {
throw new Exception('Wrong file name', 400);
}
}
foreach ($file['size'] as $i => $size) {
if($size !== 38756) {
if ($size !== 38756) {
throw new Exception('Wrong file size', 400);
}
}
foreach ($file['tmp_name'] as $i => $tmpName) {
if(\md5(\file_get_contents($tmpName)) !== 'd80e7e6999a3eb2ae0d631a96fe135a4') {
if (\md5(\file_get_contents($tmpName)) !== 'd80e7e6999a3eb2ae0d631a96fe135a4') {
throw new Exception('Wrong file uploaded', 400);
}
}
@ -242,7 +232,7 @@ $utopia->get('/v1/mock/tests/general/get-cookie')
->label('sdk.description', 'Mock a get cookie request for SDK tests')
->action(
function () use ($request) {
if($request->getCookie('cookieName', '') !== 'cookieValue') {
if ($request->getCookie('cookieName', '') !== 'cookieValue') {
throw new Exception('Missing cookie value', 400);
}
}
@ -285,15 +275,15 @@ $utopia->get('/v1/mock/tests/general/oauth2/token')
->param('code', '', function () { return new Text(100); }, 'OAuth2 state.')
->action(
function ($clientId, $redirectURI, $clientSecret, $code) use ($response) {
if($clientId != '1') {
if ($clientId != '1') {
throw new Exception('Invalid client ID');
}
if($clientSecret != '123456') {
if ($clientSecret != '123456') {
throw new Exception('Invalid client secret');
}
if($code != 'abcdef') {
if ($code != 'abcdef') {
throw new Exception('Invalid token');
}
@ -308,7 +298,7 @@ $utopia->get('/v1/mock/tests/general/oauth2/user')
->param('token', '', function () { return new Text(100); }, 'OAuth2 Access Token.')
->action(
function ($token) use ($response) {
if($token != '123456') {
if ($token != '123456') {
throw new Exception('Invalid token');
}
@ -345,12 +335,11 @@ $utopia->get('/v1/mock/tests/general/oauth2/failure')
);
$utopia->shutdown(function() use ($response, $request, &$result, $utopia) {
$route = $utopia->match($request);
$path = APP_STORAGE_CACHE.'/tests.json';
$tests = (\file_exists($path)) ? \json_decode(\file_get_contents($path), true) : [];
if(!\is_array($tests)) {
if (!\is_array($tests)) {
throw new Exception('Failed to read results', 500);
}
@ -358,9 +347,9 @@ $utopia->shutdown(function() use ($response, $request, &$result, $utopia) {
$tests = \array_merge($tests, $result);
if(!\file_put_contents($path, \json_encode($tests), LOCK_EX)) {
if (!\file_put_contents($path, \json_encode($tests), LOCK_EX)) {
throw new Exception('Failed to save resutls', 500);
}
$response->json(['result' => $route->getMethod() . ':' . $route->getURL() . ':passed']);
});
}, 'mock');

View file

@ -7,10 +7,9 @@ use Utopia\Abuse\Adapters\TimeLimit;
global $utopia, $request, $response, $register, $user, $project;
$utopia->init(function () use ($utopia, $request, $response, $register, $user, $project) {
$route = $utopia->match($request);
if(empty($project->getId()) && $route->getLabel('abuse-limit', 0) > 0) { // Abuse limit requires an active project scope
if (empty($project->getId()) && $route->getLabel('abuse-limit', 0) > 0) { // Abuse limit requires an active project scope
throw new Exception('Missing or unknown project ID', 400);
}
@ -37,7 +36,6 @@ $utopia->init(function () use ($utopia, $request, $response, $register, $user, $
$abuse = new Abuse($timeLimit);
if ($timeLimit->limit()) {
$response
->addHeader('X-RateLimit-Limit', $timeLimit->limit())
->addHeader('X-RateLimit-Remaining', $timeLimit->remaining())
@ -48,4 +46,4 @@ $utopia->init(function () use ($utopia, $request, $response, $register, $user, $
if ($abuse->check() && $request->getServer('_APP_OPTIONS_ABUSE', 'enabled') !== 'disabled') {
throw new Exception('Too many requests', 429);
}
});
}, 'api');

View file

@ -2,36 +2,31 @@
use Utopia\View;
use Utopia\Config\Config;
use Utopia\Locale\Locale;
Locale::$exceptions = false;
$roles = [
['type' => 'owner', 'label' => 'Owner'],
['type' => 'developer', 'label' => 'Developer'],
['type' => 'admin', 'label' => 'Admin'],
];
$layout = new View(__DIR__.'/../../views/layouts/default.phtml');
/* AJAX check */
if (!empty($request->getQuery('version', ''))) {
$layout->setPath(__DIR__.'/../../views/layouts/empty.phtml');
}
$layout
->setParam('title', APP_NAME)
->setParam('protocol', Config::getParam('protocol'))
->setParam('domain', $domain)
->setParam('home', $request->getServer('_APP_HOME'))
->setParam('setup', $request->getServer('_APP_SETUP'))
->setParam('class', 'unknown')
->setParam('icon', '/images/favicon.png')
->setParam('roles', $roles)
->setParam('env', $utopia->getMode())
;
$utopia->init(function () use ($utopia, $response, $request, $layout) {
/* AJAX check */
if (!empty($request->getQuery('version', ''))) {
$layout->setPath(__DIR__.'/../../views/layouts/empty.phtml');
}
$layout
->setParam('title', APP_NAME)
->setParam('protocol', Config::getParam('protocol'))
->setParam('domain', Config::getParam('domain'))
->setParam('home', $request->getServer('_APP_HOME'))
->setParam('setup', $request->getServer('_APP_SETUP'))
->setParam('class', 'unknown')
->setParam('icon', '/images/favicon.png')
->setParam('roles', [
['type' => 'owner', 'label' => 'Owner'],
['type' => 'developer', 'label' => 'Developer'],
['type' => 'admin', 'label' => 'Admin'],
])
->setParam('env', $utopia->getMode())
;
$time = (60 * 60 * 24 * 45); // 45 days cache
$isDev = (\Utopia\App::MODE_TYPE_DEVELOPMENT == Config::getParam('env'));
@ -47,4 +42,4 @@ $utopia->init(function () use ($utopia, $response, $request, $layout) {
->setParam('isDev', $isDev)
->setParam('class', $scope)
;
});
}, 'web');

View file

@ -17,7 +17,7 @@ $utopia->init(function () use ($layout) {
->setParam('description', 'Appwrite Console allows you to easily manage, monitor, and control your entire backend API and tools.')
->setParam('analytics', 'UA-26264668-5')
;
});
}, 'console');
$utopia->shutdown(function () use ($response, $request, $layout) {
$header = new View(__DIR__.'/../../views/console/comps/header.phtml');
@ -34,10 +34,10 @@ $utopia->shutdown(function () use ($response, $request, $layout) {
;
$response->send($layout->render());
});
}, 'console');
$utopia->get('/error/:code')
->desc('Error page')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'home')
->param('code', null, new \Utopia\Validator\Numeric(), 'Valid status code number', false)
@ -54,6 +54,7 @@ $utopia->get('/error/:code')
});
$utopia->get('/console')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout, $request) {
@ -69,6 +70,7 @@ $utopia->get('/console')
});
$utopia->get('/console/account')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -86,7 +88,7 @@ $utopia->get('/console/account')
});
$utopia->get('/console/notifications')
->desc('Platform console notifications')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -98,7 +100,7 @@ $utopia->get('/console/notifications')
});
$utopia->get('/console/home')
->desc('Platform console project home')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -110,7 +112,7 @@ $utopia->get('/console/home')
});
$utopia->get('/console/settings')
->desc('Platform console project settings')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($request, $layout) {
@ -129,7 +131,7 @@ $utopia->get('/console/settings')
});
$utopia->get('/console/webhooks')
->desc('Platform console project webhooks')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -145,7 +147,7 @@ $utopia->get('/console/webhooks')
});
$utopia->get('/console/keys')
->desc('Platform console project keys')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -160,7 +162,7 @@ $utopia->get('/console/keys')
});
$utopia->get('/console/tasks')
->desc('Platform console project tasks')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -172,7 +174,7 @@ $utopia->get('/console/tasks')
});
$utopia->get('/console/database')
->desc('Platform console project settings')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -184,7 +186,7 @@ $utopia->get('/console/database')
});
$utopia->get('/console/database/collection')
->desc('Platform console project database collection')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->param('id', '', function () { return new UID(); }, 'Collection unique ID.')
@ -213,11 +215,10 @@ $utopia->get('/console/database/collection')
->addHeader('Expires', 0)
->addHeader('Pragma', 'no-cache')
;
});
$utopia->get('/console/database/document')
->desc('Platform console project database document')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->param('collection', '', function () { return new UID(); }, 'Collection unique ID.')
@ -247,7 +248,7 @@ $utopia->get('/console/database/document')
});
$utopia->get('/console/storage')
->desc('Platform console project settings')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($request, $layout) {
@ -265,7 +266,7 @@ $utopia->get('/console/storage')
});
$utopia->get('/console/users')
->desc('Platform console project settings')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -279,7 +280,7 @@ $utopia->get('/console/users')
});
$utopia->get('/console/users/user')
->desc('Platform console project user')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {
@ -291,7 +292,7 @@ $utopia->get('/console/users/user')
});
$utopia->get('/console/users/teams/team')
->desc('Platform console project team')
->groups(['web', 'console'])
->label('permission', 'public')
->label('scope', 'console')
->action(function () use ($layout) {

View file

@ -9,27 +9,30 @@ use Utopia\Config\Config;
use Utopia\Validator\WhiteList;
use Utopia\Validator\Range;
$header = new View(__DIR__.'/../../views/home/comps/header.phtml');
$footer = new View(__DIR__.'/../../views/home/comps/footer.phtml');
$utopia->init(function () use ($layout) {
$header = new View(__DIR__.'/../../views/home/comps/header.phtml');
$footer = new View(__DIR__.'/../../views/home/comps/footer.phtml');
$footer
->setParam('version', Config::getParam('version'))
;
$footer
->setParam('version', Config::getParam('version'))
;
$layout
->setParam('title', APP_NAME)
->setParam('description', '')
->setParam('class', 'home')
->setParam('platforms', Config::getParam('platforms'))
->setParam('header', [$header])
->setParam('footer', [$footer])
;
$layout
->setParam('title', APP_NAME)
->setParam('description', '')
->setParam('class', 'home')
->setParam('platforms', Config::getParam('platforms'))
->setParam('header', [$header])
->setParam('footer', [$footer])
;
}, 'home');
$utopia->shutdown(function () use ($response, $layout) {
$response->send($layout->render());
});
}, 'home');
$utopia->get('/')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(
@ -39,7 +42,7 @@ $utopia->get('/')
);
$utopia->get('/auth/signin')
->desc('Login page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -51,7 +54,7 @@ $utopia->get('/auth/signin')
});
$utopia->get('/auth/signup')
->desc('Registration page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -63,7 +66,7 @@ $utopia->get('/auth/signup')
});
$utopia->get('/auth/recovery')
->desc('Password recovery page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($request, $layout) {
@ -75,7 +78,7 @@ $utopia->get('/auth/recovery')
});
$utopia->get('/auth/confirm')
->desc('Account confirmation page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -87,7 +90,7 @@ $utopia->get('/auth/confirm')
});
$utopia->get('/auth/join')
->desc('Account team join page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -99,7 +102,7 @@ $utopia->get('/auth/join')
});
$utopia->get('/auth/recovery/reset')
->desc('Password recovery page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -112,7 +115,7 @@ $utopia->get('/auth/recovery/reset')
$utopia->get('/auth/oauth2/success')
->desc('Registration page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -127,7 +130,7 @@ $utopia->get('/auth/oauth2/success')
});
$utopia->get('/auth/oauth2/failure')
->desc('Registration page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->action(function () use ($layout) {
@ -142,7 +145,7 @@ $utopia->get('/auth/oauth2/failure')
});
$utopia->get('/error/:code')
->desc('Error page')
->groups(['web', 'home'])
->label('permission', 'public')
->label('scope', 'home')
->param('code', null, new \Utopia\Validator\Numeric(), 'Valid status code number', false)
@ -159,6 +162,7 @@ $utopia->get('/error/:code')
});
$utopia->get('/open-api-2.json')
->groups(['web', 'home'])
->label('scope', 'public')
->label('docs', false)
->param('platform', APP_PLATFORM_CLIENT, function () {return new WhiteList([APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER, APP_PLATFORM_CONSOLE]);}, 'Choose target platform.', true)
@ -183,11 +187,11 @@ $utopia->get('/open-api-2.json')
}
foreach ($services as $service) { /* @noinspection PhpIncludeInspection */
if($tests && !isset($service['tests'])) {
if ($tests && !isset($service['tests'])) {
continue;
}
if($tests && !$service['tests']) {
if ($tests && !$service['tests']) {
continue;
}
@ -347,19 +351,19 @@ $utopia->get('/open-api-2.json')
];
if ($extensions) {
if(isset($output['securityDefinitions']['Project'])) {
if (isset($output['securityDefinitions']['Project'])) {
$output['securityDefinitions']['Project']['extensions'] = ['demo' => '5df5acd0d48c2'];
}
if(isset($output['securityDefinitions']['Key'])) {
if (isset($output['securityDefinitions']['Key'])) {
$output['securityDefinitions']['Key']['extensions'] = ['demo' => '919c2d18fb5d4...a2ae413da83346ad2'];
}
if(isset($output['securityDefinitions']['Locale'])) {
if (isset($output['securityDefinitions']['Locale'])) {
$output['securityDefinitions']['Locale']['extensions'] = ['demo' => 'en'];
}
if(isset($output['securityDefinitions']['Mode'])) {
if (isset($output['securityDefinitions']['Mode'])) {
$output['securityDefinitions']['Mode']['extensions'] = ['demo' => ''];
}
}
@ -374,7 +378,7 @@ $utopia->get('/open-api-2.json')
continue;
}
if($platform !== APP_PLATFORM_CONSOLE && !\in_array($platforms[$platform], $route->getLabel('sdk.platform', []))) {
if ($platform !== APP_PLATFORM_CONSOLE && !\in_array($platforms[$platform], $route->getLabel('sdk.platform', []))) {
continue;
}

View file

@ -32,7 +32,7 @@
"appwrite/php-clamav": "1.0.*",
"utopia-php/framework": "0.3.5",
"utopia-php/framework": "0.4.0",
"utopia-php/abuse": "0.2.*",
"utopia-php/audit": "0.3.*",
"utopia-php/cache": "0.2.*",

44
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "9deec50e5a99197511b5efbcaa9593bd",
"content-hash": "7f6cbe77fe2e0f8bdff33c37a4d9ca11",
"packages": [
{
"name": "appwrite/php-clamav",
@ -459,24 +459,24 @@
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "89b1a76b7fda5853401297dc4b2a093cba1fda23"
"reference": "bbf3b200bc83c1e9298580a9f99b9be248543467"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/89b1a76b7fda5853401297dc4b2a093cba1fda23",
"reference": "89b1a76b7fda5853401297dc4b2a093cba1fda23",
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbf3b200bc83c1e9298580a9f99b9be248543467",
"reference": "bbf3b200bc83c1e9298580a9f99b9be248543467",
"shasum": ""
},
"require": {
"php": ">=5.6"
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "^5.7.27 || ^7.5"
"phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^7.5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
"dev-master": "1.3-dev"
}
},
"autoload": {
@ -502,7 +502,7 @@
"keywords": [
"promise"
],
"time": "2020-02-15T23:33:03+00:00"
"time": "2020-06-21T23:10:57+00:00"
},
{
"name": "guzzlehttp/psr7",
@ -1546,16 +1546,16 @@
},
{
"name": "utopia-php/domains",
"version": "0.2.0",
"version": "0.2.1",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/domains.git",
"reference": "1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73"
"reference": "98e85296867a59c9d712d6ed768a5c5b2b297b43"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/domains/zipball/1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73",
"reference": "1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73",
"url": "https://api.github.com/repos/utopia-php/domains/zipball/98e85296867a59c9d712d6ed768a5c5b2b297b43",
"reference": "98e85296867a59c9d712d6ed768a5c5b2b297b43",
"shasum": ""
},
"require": {
@ -1592,20 +1592,20 @@
"upf",
"utopia"
],
"time": "2020-02-23T07:40:02+00:00"
"time": "2020-06-20T11:47:04+00:00"
},
{
"name": "utopia-php/framework",
"version": "0.3.5",
"version": "0.4.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/framework.git",
"reference": "ca2ebe37936983d786f57bae8ee6e006299f4942"
"reference": "30aeb2aeecf8ea2ab83242efad0f5f9fab8d4be5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/framework/zipball/ca2ebe37936983d786f57bae8ee6e006299f4942",
"reference": "ca2ebe37936983d786f57bae8ee6e006299f4942",
"url": "https://api.github.com/repos/utopia-php/framework/zipball/30aeb2aeecf8ea2ab83242efad0f5f9fab8d4be5",
"reference": "30aeb2aeecf8ea2ab83242efad0f5f9fab8d4be5",
"shasum": ""
},
"require": {
@ -1636,7 +1636,7 @@
"php",
"upf"
],
"time": "2020-06-20T11:33:46+00:00"
"time": "2020-06-25T18:21:48+00:00"
},
{
"name": "utopia-php/locale",
@ -3307,12 +3307,12 @@
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "3beabd64bdc91558b41f140cc4b14925f0416cb2"
"reference": "f32950c872a995a93807909bab69387f47afaa25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/3beabd64bdc91558b41f140cc4b14925f0416cb2",
"reference": "3beabd64bdc91558b41f140cc4b14925f0416cb2",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/f32950c872a995a93807909bab69387f47afaa25",
"reference": "f32950c872a995a93807909bab69387f47afaa25",
"shasum": ""
},
"require": {
@ -3364,7 +3364,7 @@
"keywords": [
"templating"
],
"time": "2020-06-08T10:41:25+00:00"
"time": "2020-06-22T15:25:21+00:00"
},
{
"name": "webmozart/assert",

View file

@ -16,19 +16,8 @@ ini_set('display_errors', 0);
// error_reporting(E_ALL);
$path = (isset($_GET['q'])) ? explode('/', $_GET['q']) : [];
$domain = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : '';
array_shift($path);
$version = array_shift($path);
switch ($version) { // Switch between API version
case 'v1':
$service = $version . '/' . array_shift($path);
include __DIR__ . '/../app/app.php';
break;
case 'console':
default:
$service = $version . '/';
include __DIR__ . '/../app/app.php';
break;
}
include __DIR__ . '/../app/app.php';

View file

@ -44,7 +44,7 @@ abstract class OAuth2
$this->appSecret = $appSecret;
$this->callback = $callback;
$this->state = $state;
foreach($scopes as $scope) {
foreach ($scopes as $scope) {
$this->addScope($scope);
}
}
@ -89,21 +89,21 @@ abstract class OAuth2
/**
* @param $scope
*
*
* @return $this
*/
protected function addScope(string $scope):OAuth2
{
// Add a scope to the scopes array if it isn't already present
if (!\in_array($scope, $this->scopes)){
$this->scopes[] = $scope;
// Add a scope to the scopes array if it isn't already present
if (!\in_array($scope, $this->scopes)) {
$this->scopes[] = $scope;
}
return $this;
}
/**
* @return array
*/
/**
* @return array
*/
protected function getScopes():array
{
return $this->scopes;

View file

@ -19,7 +19,7 @@ class Apple extends OAuth2
* @var array
*/
protected $scopes = [
"name",
"name",
"email"
];
@ -166,7 +166,9 @@ class Apple extends OAuth2
$success = \openssl_sign($payload, $signature, $pkey, OPENSSL_ALGO_SHA256);
if (!$success) return '';
if (!$success) {
return '';
}
return $payload.'.'.$this->encode($this->fromDER($signature, 64));
}
@ -205,8 +207,7 @@ class Apple extends OAuth2
if ('81' === \mb_substr($hex, 2, 2, '8bit')) { // LENGTH > 128
$hex = \mb_substr($hex, 6, null, '8bit');
}
else {
} else {
$hex = \mb_substr($hex, 4, null, '8bit');
}
if ('02' !== \mb_substr($hex, 0, 2, '8bit')) { // INTEGER

View file

@ -58,7 +58,7 @@ class Facebook extends OAuth2
'redirect_uri' => $this->callback,
'client_secret' => $this->appSecret,
'code' => $code
])
])
);
$accessToken = \json_decode($accessToken, true);

View file

@ -37,7 +37,6 @@ class Github extends OAuth2
'scope' => \implode(' ', $this->getScopes()),
'state' => \json_encode($this->state)
]);
}
/**

View file

@ -4,7 +4,7 @@ namespace Appwrite\Auth\OAuth2;
use Appwrite\Auth\OAuth2;
// Reference Material
// Reference Material
// https://docs.gitlab.com/ee/api/oauth2.html
class Gitlab extends OAuth2

View file

@ -4,7 +4,7 @@ namespace Appwrite\Auth\OAuth2;
use Appwrite\Auth\OAuth2;
// Reference Material
// Reference Material
// https://developers.google.com/oauthplayground/
// https://developers.google.com/identity/protocols/OAuth2
// https://developers.google.com/identity/protocols/OAuth2WebServer

View file

@ -19,7 +19,7 @@ class Microsoft extends OAuth2
* @var array
*/
protected $scopes = [
'offline_access',
'offline_access',
'user.read'
];

View file

@ -134,4 +134,4 @@ class Mock extends OAuth2
return $this->user;
}
}
}

View file

@ -15,8 +15,8 @@ class Slack extends OAuth2
* @var array
*/
protected $scopes = [
'identity.avatar',
'identity.basic',
'identity.avatar',
'identity.basic',
'identity.email',
'identity.team'
];
@ -125,7 +125,6 @@ class Slack extends OAuth2
*/
protected function getUser(string $accessToken):array
{
if (empty($this->user)) {
// https://api.slack.com/methods/users.identity
$user = $this->request(

View file

@ -137,8 +137,11 @@ class Spotify extends OAuth2
protected function getUser(string $accessToken)
{
if (empty($this->user)) {
$this->user = \json_decode($this->request('GET',
$this->resourceEndpoint . "me", ['Authorization: Bearer '.\urlencode($accessToken)]), true);
$this->user = \json_decode($this->request(
'GET',
$this->resourceEndpoint . "me",
['Authorization: Bearer '.\urlencode($accessToken)]
), true);
}
return $this->user;

View file

@ -139,8 +139,11 @@ class Twitch extends OAuth2
protected function getUser(string $accessToken)
{
if (empty($this->user)) {
$this->user = \json_decode($this->request('GET',
$this->resourceEndpoint, ['Authorization: Bearer '.\urlencode($accessToken)]), true)['data']['0'];
$this->user = \json_decode($this->request(
'GET',
$this->resourceEndpoint,
['Authorization: Bearer '.\urlencode($accessToken)]
), true)['data']['0'];
}
return $this->user;

View file

@ -153,8 +153,11 @@ class Yahoo extends OAuth2
protected function getUser(string $accessToken)
{
if (empty($this->user)) {
$this->user = \json_decode($this->request('GET',
$this->resourceEndpoint, ['Authorization: Bearer '.\urlencode($accessToken)]), true);
$this->user = \json_decode($this->request(
'GET',
$this->resourceEndpoint,
['Authorization: Bearer '.\urlencode($accessToken)]
), true);
}
return $this->user;

View file

@ -175,7 +175,7 @@ class MySQL extends Adapter
$result = $st->fetch();
if($result && isset($result['signature'])) {
if ($result && isset($result['signature'])) {
$oldSignature = $result['signature'];
if ($signature === $oldSignature) {
@ -187,14 +187,14 @@ class MySQL extends Adapter
/**
* Check Unique Keys
*/
foreach($unique as $key => $value) {
foreach ($unique as $key => $value) {
$st = $this->getPDO()->prepare('INSERT INTO `'.$this->getNamespace().'.database.unique`
SET `key` = :key;
');
$st->bindValue(':key', \md5($data['$collection'].':'.$key.'='.$value), PDO::PARAM_STR);
if(!$st->execute()) {
if (!$st->execute()) {
throw new Duplicate('Duplicated Property: '.$key.'='.$value);
}
}

View file

@ -134,7 +134,7 @@ class Document extends ArrayObject
*/
public function removeAttribute($key)
{
if(isset($this[$key])) {
if (isset($this[$key])) {
unset($this[$key]);
}

View file

@ -111,7 +111,7 @@ class Authorization extends Validator
/**
* Default value in case we need
* to reset Authorization status
*
*
* @var bool
*/
public static $statusDefault = true;
@ -119,9 +119,10 @@ class Authorization extends Validator
/**
* Change default status.
* This will be used for the
* value set on the self::reset() method
* value set on the self::reset() method
*/
public static function setDefaultStatus($status) {
public static function setDefaultStatus($status)
{
self::$statusDefault = $status;
self::$status = $status;
}

View file

@ -60,19 +60,19 @@ class DocumentId extends Validator
{
$document = $this->database->getDocument($id);
if(!$document) {
if (!$document) {
return false;
}
if(!$document instanceof Document) {
if (!$document instanceof Document) {
return false;
}
if(!$document->getId()) {
if (!$document->getId()) {
return false;
}
if($document->getCollection() !== $this->collection) {
if ($document->getCollection() !== $this->collection) {
return false;
}

View file

@ -34,7 +34,7 @@ class Key extends Validator
*/
public function isValid($value)
{
if(!\is_string($value)) {
if (!\is_string($value)) {
return false;
}

View file

@ -26,7 +26,7 @@ class CNAME extends Validator
/**
* Check if CNAME record target value matches selected target
*
*
* @param string $domain
*
* @return bool
@ -39,12 +39,12 @@ class CNAME extends Validator
return false;
}
if(!$records || !\is_array($records)) {
if (!$records || !\is_array($records)) {
return false;
}
foreach($records as $record) {
if(isset($record['target']) && $record['target'] === $this->target) {
foreach ($records as $record) {
if (isset($record['target']) && $record['target'] === $this->target) {
return true;
}
}

View file

@ -56,7 +56,7 @@ class Origin extends Validator
*/
public function __construct($platforms)
{
foreach($platforms as $platform) {
foreach ($platforms as $platform) {
$type = (isset($platform['type'])) ? $platform['type'] : '';
switch ($type) {
@ -81,7 +81,7 @@ class Origin extends Validator
public function getDescription()
{
if(!\array_key_exists($this->client, $this->platforms)) {
if (!\array_key_exists($this->client, $this->platforms)) {
return 'Unsupported platform';
}
@ -92,7 +92,7 @@ class Origin extends Validator
/**
* Check if Origin has been whiltlisted
* for access to the API
*
*
* @param string $origin
*
* @return bool
@ -105,11 +105,11 @@ class Origin extends Validator
$this->host = $host;
$this->client = $scheme;
if(empty($host)) {
if (empty($host)) {
return true;
}
if(\in_array($host, $this->clients)) {
if (\in_array($host, $this->clients)) {
return true;
}

View file

@ -157,16 +157,15 @@ class Local extends Device
*/
public function delete(string $path, bool $recursive = false):bool
{
if(\is_dir($path) && $recursive) {
if (\is_dir($path) && $recursive) {
$files = \glob($path.'*', GLOB_MARK); // GLOB_MARK adds a slash to directories returned
foreach($files as $file) {
$this->delete($file, true);
foreach ($files as $file) {
$this->delete($file, true);
}
\rmdir($path);
}
elseif(\is_file($path)) {
} elseif (\is_file($path)) {
return \unlink($path);
}

View file

@ -78,7 +78,7 @@ class Storage
*
* @return string
*/
static public function human($bytes, $decimals = 2)
public static function human($bytes, $decimals = 2)
{
$units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$step = 1024;

View file

@ -64,7 +64,7 @@ class FileType extends Validator
*/
public function isValid($path)
{
if(!\is_readable($path)) {
if (!\is_readable($path)) {
return false;
}

View file

@ -6,14 +6,14 @@ class URL
{
/**
* Parse URL
*
*
* Take a URL string and split it to array parts
*
*
* @param string $url
*
*
* @return array
*/
static public function parse(string $url):array
public static function parse(string $url):array
{
$default = [
'scheme' => '',
@ -31,15 +31,15 @@ class URL
/**
* Un-Parse URL
*
*
* Take URL parts and combine them to a valid string
*
*
* @param array $url
* @param array $ommit
*
*
* @return string
*/
static public function unparse(array $url, array $ommit = []):string
public static function unparse(array $url, array $ommit = []):string
{
if (isset($url['path']) && \mb_substr($url['path'], 0, 1) !== '/') {
$url['path'] = '/'.$url['path'];
@ -78,14 +78,14 @@ class URL
/**
* Parse Query String
*
*
* Convert query string to array
*
*
* @param string $query
*
*
* @return array
*/
static public function parseQuery(string $query):array
public static function parseQuery(string $query):array
{
\parse_str($query, $result);
@ -94,15 +94,15 @@ class URL
/**
* Un-Parse Query String
*
*
* Convert query string array to string
*
*
* @param string $query
*
*
* @return array
*/
static public function unparseQuery(array $query):string
public static function unparseQuery(array $query):string
{
return \http_build_query($query);
}
}
}

View file

@ -173,7 +173,7 @@ class HealthCustomClientTest extends Scope
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertIsInt($response['body']['size']);
$this->assertLessThan(100, $response['body']['size']);
$this->assertLessThan(120, $response['body']['size']);
/**
* Test for FAILURE