Fixed broken paths
This commit is contained in:
parent
c5a6dabbb6
commit
77a57e381f
8 changed files with 842 additions and 6 deletions
|
@ -88,4 +88,33 @@ return [
|
|||
'sdk' => false,
|
||||
'tests' => true,
|
||||
],
|
||||
|
||||
'v1/keys' => [
|
||||
'name' => 'Keys',
|
||||
'description' => '',
|
||||
'controller' => 'controllers/api/keys.php',
|
||||
'sdk' => true,
|
||||
'tests' => false,
|
||||
],
|
||||
'v1/platforms' => [
|
||||
'name' => 'Platforms',
|
||||
'description' => '',
|
||||
'controller' => 'controllers/api/platforms.php',
|
||||
'sdk' => true,
|
||||
'tests' => false,
|
||||
],
|
||||
'v1/tasks' => [
|
||||
'name' => 'Tasks',
|
||||
'description' => '',
|
||||
'controller' => 'controllers/api/tasks.php',
|
||||
'sdk' => true,
|
||||
'tests' => false,
|
||||
],
|
||||
'v1/webhooks' => [
|
||||
'name' => 'Webhooks',
|
||||
'description' => '',
|
||||
'controller' => 'controllers/api/webhooks.php',
|
||||
'sdk' => true,
|
||||
'tests' => false,
|
||||
],
|
||||
];
|
||||
|
|
|
@ -80,7 +80,7 @@ $utopia->get('/v1/account/sessions')
|
|||
->action(
|
||||
function () use ($response, $user) {
|
||||
$tokens = $user->getAttribute('tokens', []);
|
||||
$reader = new Reader(__DIR__.'/../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$sessions = [];
|
||||
$current = Auth::tokenVerify($tokens, Auth::TOKEN_TYPE_LOGIN, Auth::$secret);
|
||||
$index = 0;
|
||||
|
@ -158,7 +158,7 @@ $utopia->get('/v1/account/security')
|
|||
'account.update.password',
|
||||
]);
|
||||
|
||||
$reader = new Reader(__DIR__.'/../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$output = [];
|
||||
|
||||
foreach ($logs as $i => &$log) {
|
||||
|
|
|
@ -4,17 +4,33 @@ global $utopia, $request, $response, $register, $user, $consoleDB, $projectDB, $
|
|||
|
||||
use Utopia\Exception;
|
||||
use Utopia\Response;
|
||||
use Utopia\Validator\ArrayList;
|
||||
use Utopia\Validator\Text;
|
||||
use Utopia\Validator\WhiteList;
|
||||
use Utopia\Validator\Range;
|
||||
use Utopia\Validator\URL;
|
||||
use Task\Validator\Cron;
|
||||
use Database\Database;
|
||||
use Database\Document;
|
||||
use Database\Validator\UID;
|
||||
use OpenSSL\OpenSSL;
|
||||
use Cron\CronExpression;
|
||||
|
||||
include_once __DIR__ . '/../shared/api.php';
|
||||
|
||||
$scopes = [ // TODO sync with console UI list
|
||||
'users.read',
|
||||
'users.write',
|
||||
'teams.read',
|
||||
'teams.write',
|
||||
'collections.read',
|
||||
'collections.write',
|
||||
'documents.read',
|
||||
'documents.write',
|
||||
'files.read',
|
||||
'files.write',
|
||||
];
|
||||
|
||||
$utopia->get('/v1/projects')
|
||||
->desc('List Projects')
|
||||
->label('scope', 'projects.read')
|
||||
|
@ -386,3 +402,790 @@ $utopia->delete('/v1/projects/:projectId')
|
|||
$response->noContent();
|
||||
}
|
||||
);
|
||||
|
||||
// Webhooks
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/webhooks')
|
||||
->desc('List Webhooks')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'listWebhooks')
|
||||
->param('projectId', '', function () { return new UID(); }, 'Project unique ID.')
|
||||
->action(
|
||||
function ($projectId) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$webhooks = $project->getAttribute('webhooks', []);
|
||||
|
||||
foreach ($webhooks as $webhook) { /* @var $webhook Document */
|
||||
$httpPass = json_decode($webhook->getAttribute('httpPass', '{}'), true);
|
||||
|
||||
if (empty($httpPass) || !isset($httpPass['version'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V'.$httpPass['version']);
|
||||
|
||||
$webhook->setAttribute('httpPass', OpenSSL::decrypt($httpPass['data'], $httpPass['method'], $key, 0, hex2bin($httpPass['iv']), hex2bin($httpPass['tag'])));
|
||||
}
|
||||
|
||||
$response->json($webhooks);
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/webhooks/:webhookId')
|
||||
->desc('Get Webhook')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'getWebhook')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.')
|
||||
->action(
|
||||
function ($projectId, $webhookId) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', []));
|
||||
|
||||
if (empty($webhook) && $webhook instanceof Document) {
|
||||
throw new Exception('Webhook not found', 404);
|
||||
}
|
||||
|
||||
$httpPass = json_decode($webhook->getAttribute('httpPass', '{}'), true);
|
||||
|
||||
if (!empty($httpPass) && isset($httpPass['version'])) {
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V'.$httpPass['version']);
|
||||
$webhook->setAttribute('httpPass', OpenSSL::decrypt($httpPass['data'], $httpPass['method'], $key, 0, hex2bin($httpPass['iv']), hex2bin($httpPass['tag'])));
|
||||
}
|
||||
|
||||
$response->json($webhook->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->post('/v1/projects/:projectId/webhooks')
|
||||
->desc('Create Webhook')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createWebhook')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Webhook name')
|
||||
->param('events', null, function () { return new ArrayList(new Text(256)); }, 'Webhook events list')
|
||||
->param('url', null, function () { return new Text(2000); }, 'Webhook URL')
|
||||
->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled')
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password', true)
|
||||
->action(
|
||||
function ($projectId, $name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V1');
|
||||
$iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM));
|
||||
$tag = null;
|
||||
$httpPass = json_encode([
|
||||
'data' => OpenSSL::encrypt($httpPass, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag),
|
||||
'method' => OpenSSL::CIPHER_AES_128_GCM,
|
||||
'iv' => bin2hex($iv),
|
||||
'tag' => bin2hex($tag),
|
||||
'version' => '1',
|
||||
]);
|
||||
|
||||
$webhook = $consoleDB->createDocument([
|
||||
'$collection' => Database::SYSTEM_COLLECTION_WEBHOOKS,
|
||||
'$permissions' => [
|
||||
'read' => ['team:'.$project->getAttribute('teamId', null)],
|
||||
'write' => ['team:'.$project->getAttribute('teamId', null).'/owner', 'team:'.$project->getAttribute('teamId', null).'/developer'],
|
||||
],
|
||||
'name' => $name,
|
||||
'events' => $events,
|
||||
'url' => $url,
|
||||
'security' => (int) $security,
|
||||
'httpUser' => $httpUser,
|
||||
'httpPass' => $httpPass,
|
||||
]);
|
||||
|
||||
if (false === $webhook) {
|
||||
throw new Exception('Failed saving webhook to DB', 500);
|
||||
}
|
||||
|
||||
$project->setAttribute('webhooks', $webhook, Document::SET_TYPE_APPEND);
|
||||
|
||||
$project = $consoleDB->updateDocument($project->getArrayCopy());
|
||||
|
||||
if (false === $project) {
|
||||
throw new Exception('Failed saving project to DB', 500);
|
||||
}
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->json($webhook->getArrayCopy())
|
||||
;
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->put('/v1/projects/:projectId/webhooks/:webhookId')
|
||||
->desc('Update Webhook')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'updateWebhook')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Webhook name')
|
||||
->param('events', null, function () { return new ArrayList(new Text(256)); }, 'Webhook events list')
|
||||
->param('url', null, function () { return new Text(2000); }, 'Webhook URL')
|
||||
->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled')
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password', true)
|
||||
->action(
|
||||
function ($projectId, $webhookId, $name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V1');
|
||||
$iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM));
|
||||
$tag = null;
|
||||
$httpPass = json_encode([
|
||||
'data' => OpenSSL::encrypt($httpPass, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag),
|
||||
'method' => OpenSSL::CIPHER_AES_128_GCM,
|
||||
'iv' => bin2hex($iv),
|
||||
'tag' => bin2hex($tag),
|
||||
'version' => '1',
|
||||
]);
|
||||
|
||||
$webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', []));
|
||||
|
||||
if (empty($webhook) && $webhook instanceof Document) {
|
||||
throw new Exception('Webhook not found', 404);
|
||||
}
|
||||
|
||||
$webhook
|
||||
->setAttribute('name', $name)
|
||||
->setAttribute('events', $events)
|
||||
->setAttribute('url', $url)
|
||||
->setAttribute('security', (int) $security)
|
||||
->setAttribute('httpUser', $httpUser)
|
||||
->setAttribute('httpPass', $httpPass)
|
||||
;
|
||||
|
||||
if (false === $consoleDB->updateDocument($webhook->getArrayCopy())) {
|
||||
throw new Exception('Failed saving webhook to DB', 500);
|
||||
}
|
||||
|
||||
$response->json($webhook->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->delete('/v1/projects/:projectId/webhooks/:webhookId')
|
||||
->desc('Delete Webhook')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'deleteWebhook')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.')
|
||||
->action(
|
||||
function ($projectId, $webhookId) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', []));
|
||||
|
||||
if (empty($webhook) && $webhook instanceof Document) {
|
||||
throw new Exception('Webhook not found', 404);
|
||||
}
|
||||
|
||||
if (!$consoleDB->deleteDocument($webhook->getUid())) {
|
||||
throw new Exception('Failed to remove webhook from DB', 500);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
}
|
||||
);
|
||||
|
||||
// Keys
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/keys')
|
||||
->desc('List Keys')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'listKeys')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->action(
|
||||
function ($projectId) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$response->json($project->getAttribute('keys', [])); //FIXME make sure array objects return correctly
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/keys/:keyId')
|
||||
->desc('Get Key')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'getKey')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('keyId', null, function () { return new UID(); }, 'Key unique ID.')
|
||||
->action(
|
||||
function ($projectId, $keyId) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$key = $project->search('$uid', $keyId, $project->getAttribute('keys', []));
|
||||
|
||||
if (empty($key) && $key instanceof Document) {
|
||||
throw new Exception('Key not found', 404);
|
||||
}
|
||||
|
||||
$response->json($key->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->post('/v1/projects/:projectId/keys')
|
||||
->desc('Create Key')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createKey')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Key name')
|
||||
->param('scopes', null, function () use ($scopes) { return new ArrayList(new WhiteList($scopes)); }, 'Key scopes list')
|
||||
->action(
|
||||
function ($projectId, $name, $scopes) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$key = $consoleDB->createDocument([
|
||||
'$collection' => Database::SYSTEM_COLLECTION_KEYS,
|
||||
'$permissions' => [
|
||||
'read' => ['team:'.$project->getAttribute('teamId', null)],
|
||||
'write' => ['team:'.$project->getAttribute('teamId', null).'/owner', 'team:'.$project->getAttribute('teamId', null).'/developer'],
|
||||
],
|
||||
'name' => $name,
|
||||
'scopes' => $scopes,
|
||||
'secret' => bin2hex(random_bytes(128)),
|
||||
]);
|
||||
|
||||
if (false === $key) {
|
||||
throw new Exception('Failed saving key to DB', 500);
|
||||
}
|
||||
|
||||
$project->setAttribute('keys', $key, Document::SET_TYPE_APPEND);
|
||||
|
||||
$project = $consoleDB->updateDocument($project->getArrayCopy());
|
||||
|
||||
if (false === $project) {
|
||||
throw new Exception('Failed saving project to DB', 500);
|
||||
}
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->json($key->getArrayCopy())
|
||||
;
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->put('/v1/projects/:projectId/keys/:keyId')
|
||||
->desc('Update Key')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'updateKey')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('keyId', null, function () { return new UID(); }, 'Key unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Key name')
|
||||
->param('scopes', null, function () use ($scopes) { return new ArrayList(new WhiteList($scopes)); }, 'Key scopes list')
|
||||
->action(
|
||||
function ($projectId, $keyId, $name, $scopes) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$key = $project->search('$uid', $keyId, $project->getAttribute('keys', []));
|
||||
|
||||
if (empty($key) && $key instanceof Document) {
|
||||
throw new Exception('Key not found', 404);
|
||||
}
|
||||
|
||||
$key
|
||||
->setAttribute('name', $name)
|
||||
->setAttribute('scopes', $scopes)
|
||||
;
|
||||
|
||||
if (false === $consoleDB->updateDocument($key->getArrayCopy())) {
|
||||
throw new Exception('Failed saving key to DB', 500);
|
||||
}
|
||||
|
||||
$response->json($key->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->delete('/v1/projects/:projectId/keys/:keyId')
|
||||
->desc('Delete Key')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'deleteKey')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('keyId', null, function () { return new UID(); }, 'Key unique ID.')
|
||||
->action(
|
||||
function ($projectId, $keyId) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$key = $project->search('$uid', $keyId, $project->getAttribute('keys', []));
|
||||
|
||||
if (empty($key) && $key instanceof Document) {
|
||||
throw new Exception('Key not found', 404);
|
||||
}
|
||||
|
||||
if (!$consoleDB->deleteDocument($key->getUid())) {
|
||||
throw new Exception('Failed to remove key from DB', 500);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
}
|
||||
);
|
||||
|
||||
// Tasks
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/tasks')
|
||||
->desc('List Tasks')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'listTasks')
|
||||
->param('projectId', '', function () { return new UID(); }, 'Project unique ID.')
|
||||
->action(
|
||||
function ($projectId) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$tasks = $project->getAttribute('tasks', []);
|
||||
|
||||
foreach ($tasks as $task) { /* @var $task Document */
|
||||
$httpPass = json_decode($task->getAttribute('httpPass', '{}'), true);
|
||||
|
||||
if (empty($httpPass) || !isset($httpPass['version'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V'.$httpPass['version']);
|
||||
|
||||
$task->setAttribute('httpPass', OpenSSL::decrypt($httpPass['data'], $httpPass['method'], $key, 0, hex2bin($httpPass['iv']), hex2bin($httpPass['tag'])));
|
||||
}
|
||||
|
||||
$response->json($tasks);
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/tasks/:taskId')
|
||||
->desc('Get Task')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'getTask')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('taskId', null, function () { return new UID(); }, 'Task unique ID.')
|
||||
->action(
|
||||
function ($projectId, $taskId) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$task = $project->search('$uid', $taskId, $project->getAttribute('tasks', []));
|
||||
|
||||
if (empty($task) && $task instanceof Document) {
|
||||
throw new Exception('Task not found', 404);
|
||||
}
|
||||
|
||||
$httpPass = json_decode($task->getAttribute('httpPass', '{}'), true);
|
||||
|
||||
if (!empty($httpPass) && isset($httpPass['version'])) {
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V'.$httpPass['version']);
|
||||
$task->setAttribute('httpPass', OpenSSL::decrypt($httpPass['data'], $httpPass['method'], $key, 0, hex2bin($httpPass['iv']), hex2bin($httpPass['tag'])));
|
||||
}
|
||||
|
||||
$response->json($task->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->post('/v1/projects/:projectId/tasks')
|
||||
->desc('Create Task')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createTask')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Task name')
|
||||
->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status')
|
||||
->param('schedule', null, function () { return new Cron(); }, 'Task schedule syntax')
|
||||
->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled')
|
||||
->param('httpMethod', '', function () { return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); }, 'Task HTTP method')
|
||||
->param('httpUrl', '', function () { return new URL(); }, 'Task HTTP URL')
|
||||
->param('httpHeaders', null, function () { return new ArrayList(new Text(256)); }, 'Task HTTP headers list', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password', true)
|
||||
->action(
|
||||
function ($projectId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$cron = CronExpression::factory($schedule);
|
||||
$next = ($status == 'play') ? $cron->getNextRunDate()->format('U') : null;
|
||||
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V1');
|
||||
$iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM));
|
||||
$tag = null;
|
||||
$httpPass = json_encode([
|
||||
'data' => OpenSSL::encrypt($httpPass, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag),
|
||||
'method' => OpenSSL::CIPHER_AES_128_GCM,
|
||||
'iv' => bin2hex($iv),
|
||||
'tag' => bin2hex($tag),
|
||||
'version' => '1',
|
||||
]);
|
||||
|
||||
$task = $consoleDB->createDocument([
|
||||
'$collection' => Database::SYSTEM_COLLECTION_TASKS,
|
||||
'$permissions' => [
|
||||
'read' => ['team:'.$project->getAttribute('teamId', null)],
|
||||
'write' => ['team:'.$project->getAttribute('teamId', null).'/owner', 'team:'.$project->getAttribute('teamId', null).'/developer'],
|
||||
],
|
||||
'name' => $name,
|
||||
'status' => $status,
|
||||
'schedule' => $schedule,
|
||||
'updated' => time(),
|
||||
'previous' => null,
|
||||
'next' => $next,
|
||||
'security' => (int) $security,
|
||||
'httpMethod' => $httpMethod,
|
||||
'httpUrl' => $httpUrl,
|
||||
'httpHeaders' => $httpHeaders,
|
||||
'httpUser' => $httpUser,
|
||||
'httpPass' => $httpPass,
|
||||
'log' => '{}',
|
||||
'failures' => 0,
|
||||
]);
|
||||
|
||||
if (false === $task) {
|
||||
throw new Exception('Failed saving tasks to DB', 500);
|
||||
}
|
||||
|
||||
$project->setAttribute('tasks', $task, Document::SET_TYPE_APPEND);
|
||||
|
||||
$project = $consoleDB->updateDocument($project->getArrayCopy());
|
||||
|
||||
if (false === $project) {
|
||||
throw new Exception('Failed saving project to DB', 500);
|
||||
}
|
||||
|
||||
if ($next) {
|
||||
ResqueScheduler::enqueueAt($next, 'v1-tasks', 'TasksV1', $task->getArrayCopy());
|
||||
}
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->json($task->getArrayCopy())
|
||||
;
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->put('/v1/projects/:projectId/tasks/:taskId')
|
||||
->desc('Update Task')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'updateTask')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('taskId', null, function () { return new UID(); }, 'Task unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Task name')
|
||||
->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status')
|
||||
->param('schedule', null, function () { return new Cron(); }, 'Task schedule syntax')
|
||||
->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled')
|
||||
->param('httpMethod', '', function () { return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); }, 'Task HTTP method')
|
||||
->param('httpUrl', '', function () { return new URL(); }, 'Task HTTP URL')
|
||||
->param('httpHeaders', null, function () { return new ArrayList(new Text(256)); }, 'Task HTTP headers list', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password', true)
|
||||
->action(
|
||||
function ($projectId, $taskId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$task = $project->search('$uid', $taskId, $project->getAttribute('tasks', []));
|
||||
|
||||
if (empty($task) && $task instanceof Document) {
|
||||
throw new Exception('Task not found', 404);
|
||||
}
|
||||
|
||||
$cron = CronExpression::factory($schedule);
|
||||
$next = ($status == 'play') ? $cron->getNextRunDate()->format('U') : null;
|
||||
|
||||
$key = $request->getServer('_APP_OPENSSL_KEY_V1');
|
||||
$iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM));
|
||||
$tag = null;
|
||||
$httpPass = json_encode([
|
||||
'data' => OpenSSL::encrypt($httpPass, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag),
|
||||
'method' => OpenSSL::CIPHER_AES_128_GCM,
|
||||
'iv' => bin2hex($iv),
|
||||
'tag' => bin2hex($tag),
|
||||
'version' => '1',
|
||||
]);
|
||||
|
||||
$task
|
||||
->setAttribute('name', $name)
|
||||
->setAttribute('status', $status)
|
||||
->setAttribute('schedule', $schedule)
|
||||
->setAttribute('updated', time())
|
||||
->setAttribute('next', $next)
|
||||
->setAttribute('security', (int) $security)
|
||||
->setAttribute('httpMethod', $httpMethod)
|
||||
->setAttribute('httpUrl', $httpUrl)
|
||||
->setAttribute('httpHeaders', $httpHeaders)
|
||||
->setAttribute('httpUser', $httpUser)
|
||||
->setAttribute('httpPass', $httpPass)
|
||||
;
|
||||
|
||||
if (false === $consoleDB->updateDocument($task->getArrayCopy())) {
|
||||
throw new Exception('Failed saving tasks to DB', 500);
|
||||
}
|
||||
|
||||
if ($next) {
|
||||
ResqueScheduler::enqueueAt($next, 'v1-tasks', 'TasksV1', $task->getArrayCopy());
|
||||
}
|
||||
|
||||
$response->json($task->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->delete('/v1/projects/:projectId/tasks/:taskId')
|
||||
->desc('Delete Task')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'deleteTask')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('taskId', null, function () { return new UID(); }, 'Task unique ID.')
|
||||
->action(
|
||||
function ($projectId, $taskId) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$task = $project->search('$uid', $taskId, $project->getAttribute('tasks', []));
|
||||
|
||||
if (empty($task) && $task instanceof Document) {
|
||||
throw new Exception('Task not found', 404);
|
||||
}
|
||||
|
||||
if (!$consoleDB->deleteDocument($task->getUid())) {
|
||||
throw new Exception('Failed to remove tasks from DB', 500);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
}
|
||||
);
|
||||
|
||||
// Platforms
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/platforms')
|
||||
->desc('List Platforms')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'listPlatforms')
|
||||
->param('projectId', '', function () { return new UID(); }, 'Project unique ID.')
|
||||
->action(
|
||||
function ($projectId) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$platforms = $project->getAttribute('platforms', []);
|
||||
|
||||
$response->json($platforms);
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->get('/v1/projects/:projectId/platforms/:platformId')
|
||||
->desc('Get Platform')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'getPlatform')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.')
|
||||
->action(
|
||||
function ($projectId, $platformId) use ($request, $response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', []));
|
||||
|
||||
if (empty($platform) && $platform instanceof Document) {
|
||||
throw new Exception('Platform not found', 404);
|
||||
}
|
||||
|
||||
$response->json($platform->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->post('/v1/projects/:projectId/platforms')
|
||||
->desc('Create Platform')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createPlatform')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('type', null, function () { return new WhiteList(['web', 'ios', 'android', 'unity']); }, 'Platform name')
|
||||
->param('name', null, function () { return new Text(256); }, 'Platform name')
|
||||
->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS', true)
|
||||
->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID', true)
|
||||
->param('url', '', function () { return new URL(); }, 'Platform client URL', true)
|
||||
->action(
|
||||
function ($projectId, $type, $name, $key, $store, $url) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$platform = $consoleDB->createDocument([
|
||||
'$collection' => Database::SYSTEM_COLLECTION_PLATFORMS,
|
||||
'$permissions' => [
|
||||
'read' => ['team:'.$project->getAttribute('teamId', null)],
|
||||
'write' => ['team:'.$project->getAttribute('teamId', null).'/owner', 'team:'.$project->getAttribute('teamId', null).'/developer'],
|
||||
],
|
||||
'type' => $type,
|
||||
'name' => $name,
|
||||
'key' => $key,
|
||||
'store' => $store,
|
||||
'url' => $url,
|
||||
'dateCreated' => time(),
|
||||
'dateUpdated' => time(),
|
||||
]);
|
||||
|
||||
if (false === $platform) {
|
||||
throw new Exception('Failed saving platform to DB', 500);
|
||||
}
|
||||
|
||||
$project->setAttribute('platforms', $platform, Document::SET_TYPE_APPEND);
|
||||
|
||||
$project = $consoleDB->updateDocument($project->getArrayCopy());
|
||||
|
||||
if (false === $project) {
|
||||
throw new Exception('Failed saving project to DB', 500);
|
||||
}
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->json($platform->getArrayCopy())
|
||||
;
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->put('/v1/projects/:projectId/platforms/:platformId')
|
||||
->desc('Update Platform')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'updatePlatform')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Platform name')
|
||||
->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS', true)
|
||||
->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID', true)
|
||||
->param('url', '', function () { return new URL(); }, 'Platform client URL', true)
|
||||
->action(
|
||||
function ($projectId, $platformId, $name, $key, $store, $url) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', []));
|
||||
|
||||
if (empty($platform) && $platform instanceof Document) {
|
||||
throw new Exception('Platform not found', 404);
|
||||
}
|
||||
|
||||
$platform
|
||||
->setAttribute('name', $name)
|
||||
->setAttribute('dateUpdated', time())
|
||||
->setAttribute('key', $key)
|
||||
->setAttribute('store', $store)
|
||||
->setAttribute('url', $url)
|
||||
;
|
||||
|
||||
if (false === $consoleDB->updateDocument($platform->getArrayCopy())) {
|
||||
throw new Exception('Failed saving platform to DB', 500);
|
||||
}
|
||||
|
||||
$response->json($platform->getArrayCopy());
|
||||
}
|
||||
);
|
||||
|
||||
$utopia->delete('/v1/projects/:projectId/platforms/:platformId')
|
||||
->desc('Delete Platform')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'deletePlatform')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.')
|
||||
->action(
|
||||
function ($projectId, $platformId) use ($response, $consoleDB) {
|
||||
$project = $consoleDB->getDocument($projectId);
|
||||
|
||||
if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) {
|
||||
throw new Exception('Project not found', 404);
|
||||
}
|
||||
|
||||
$platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', []));
|
||||
|
||||
if (empty($platform) && $platform instanceof Document) {
|
||||
throw new Exception('Platform not found', 404);
|
||||
}
|
||||
|
||||
if (!$consoleDB->deleteDocument($platform->getUid())) {
|
||||
throw new Exception('Failed to remove platform from DB', 500);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
}
|
||||
);
|
|
@ -158,7 +158,7 @@ $utopia->get('/v1/users/:userId/sessions')
|
|||
}
|
||||
|
||||
$tokens = $user->getAttribute('tokens', []);
|
||||
$reader = new Reader(__DIR__.'/../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$sessions = [];
|
||||
$index = 0;
|
||||
$countries = Locale::getText('countries');
|
||||
|
@ -226,7 +226,7 @@ $utopia->get('/v1/users/:userId/logs')
|
|||
|
||||
$logs = $au->getLogsByUser($user->getUid(), $user->getAttribute('type', 0));
|
||||
|
||||
$reader = new Reader(__DIR__.'/../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb');
|
||||
$output = [];
|
||||
|
||||
foreach ($logs as $i => &$log) {
|
||||
|
|
|
@ -54,6 +54,8 @@ services:
|
|||
- appwrite
|
||||
volumes:
|
||||
- appwrite-db:/var/lib/mysql:rw
|
||||
ports:
|
||||
- "3306:3306"
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=rootsecretpassword
|
||||
- MYSQL_DATABASE=appwrite
|
||||
|
|
2
public/dist/styles/default-ltr.css
vendored
2
public/dist/styles/default-ltr.css
vendored
File diff suppressed because one or more lines are too long
2
public/dist/styles/default-rtl.css
vendored
2
public/dist/styles/default-rtl.css
vendored
File diff suppressed because one or more lines are too long
|
@ -19,6 +19,7 @@ body > footer {
|
|||
|
||||
a {
|
||||
color: #505050;
|
||||
font-size: 13px;
|
||||
&:hover {
|
||||
border-bottom-color: #505050;
|
||||
}
|
||||
|
@ -28,6 +29,7 @@ body > footer {
|
|||
.clear;
|
||||
|
||||
li {
|
||||
font-size: 13px;
|
||||
.pull-start;
|
||||
.margin-end;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue